文字列を指定すると、その中の最初の非繰り返し文字を見つけてインデックスを返します。存在しない場合は-1を返します。なぜこのアルゴリズムはとても遅いのですか?
S = "leetcode" リターン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;
}
私はこの質問を考えるようになるかもしれない何か(単なる文字の範囲「」「Z」にからなる文字列の)擬似コードアルゴリズムhttp://codereview.stackexchange.com/より適しています。 – maffo
シンプルなO(n)が存在します。最初のパスで文字列の各文字をカウントし、2番目のパスはカウント1の最初の文字を見つけます。 –
カウントを記録するにはLinkedHashMapが必要ですか? – user697911