給定一個字符串,找到它中的第一個非重複字符並返回它的索引。如果它不存在,則返回-1。爲什麼這個算法很慢?
S = 「本文給出了」 返回0
S = 「loveleetcode」, 回報2
這是我的解決方案,簡單易懂。但是,在LeetCode上報告爲「時間超出限制」,這意味着它太慢了。這是一個O(n^2)解決方案。
public int firstUniqChar(String s) {
if(s==null || s.isEmpty()){
return -1;
}
if(s.length()==1){
return 0;
}
char[] ss = s.toCharArray();
int size = s.length();
HashSet<Character> repeats = new HashSet<Character>();
for(int i=0; i<size; i++){
for(int j=i+1; j<size; j++){
if(repeats.contains(ss[i])){
continue;
}
if(ss[i]==ss[j]){
repeats.add(ss[i]);
break;
}
}
if(!repeats.contains(ss[i])){
return i;
}
}
return -1;
}
然而,另一個版本似乎更慢,因爲「時間超過限制」不判斷,如下:
static int firstUniqChar(String s) {
if(s==null || s.isEmpty()){
return -1;
}
if(s.length()==1){
return 0;
}
char[] ss = s.toCharArray();
int size = s.length();
for(int i=0; i<size; i++){
boolean unique = true;
for(int j=i+1; j<size; j++){
if(ss[i]==ss[j]){
unique = false;
break;
}
}
if(unique){
for(int j=0; j<i; j++){
if(ss[i]==ss[j]){
unique = false;
break;
}
}
}
if(unique){
return i;
}
}
return -1;
}
我認爲這個問題更適合http://codereview.stackexchange.com/ – maffo
一個簡單的O(n)存在...第一遍,計算字符串的每個字母,第二遍找到計數爲1的第一個字母... –
然後你需要一個LinkedHashMap來記錄計數? – user697911