給定一個字符串斗这,找到它的第一個不重復(fù)的字符备禀,并返回它的索引。如果不存在洪添,則返回 -1。
案例:
s = "leetcode"
返回 0.
s = "loveleetcode",
返回 2.
注意事項:您可以假定該字符串只包含小寫字母雀费。
思路1
用s[i]-'a'作為數(shù)組flag的下標(biāo)干奢,當(dāng)s[i]有相同的字符時,相對應(yīng)的flag[s[i]-'a']的值就會加1盏袄,而當(dāng)s[i]只有一個字符時忿峻,相對應(yīng)的flag[s[i]-'a']的值為1
int firstUniqChar(char* s) {
int flag[26]={0};
int length=strlen(s);
for(int i=0;i<length;++i){
flag[s[i]-'a']+=1;
}
for(int i=0;i<length;++i){
if(flag[s[i]-'a']==1){
return i;
}
}
return -1;
}
思路2
對26個字母進(jìn)行遍歷,indexOf(c)方法返回字符c匹配的第一個位置辕羽,lastIndexOf(c)方法返回字符c匹配的倒數(shù)第一個位置炭菌,如果返回值為-1,說明沒有這個字符逛漫,如果這兩個相同黑低,說明該字符只有一個,而只有單個的字符酌毡,可能有多種克握,所以還需min變量存儲下標(biāo)最小的數(shù)。
class Solution {
public int firstUniqChar(String s) {
int min=-1;
for(char c='a';c<='z';++c){
int pre=s.indexOf(c);//-1
int last=s.lastIndexOf(c);
if(pre!=-1&&(pre==last)){//存在的字符枷踏,求出來的都是只出現(xiàn)一次的字符菩暗,但這樣的字符可能會有多個
if(min==-1){
min=pre;
}
if(min>pre){
min=pre;
}
}
}
if(min==-1){
return -1;
}
return min;
}
}
思路3
對每個字符進(jìn)行遍歷,拿第一個字符去比較剩下的字符旭蠕,看是否相等停团,如比到最后一個字符還是不相等旷坦,則該字符就是單次出現(xiàn),如果相等佑稠,則輪到第二個字符去比較剩下的字符秒梅,以此類推
class Solution {
public int firstUniqChar(String s) {
char []str=s.toCharArray();
if(str.length==1){
return 0;
}
for(int i=0;i<str.length;++i){
for(int j=0;j<str.length;++j){
if(i!=j){
if(str[i]==str[j]){
break;
}
}
if(j==str.length-1){
return i;
}
}
}
return -1;
}
}