給定一個(gè)字符串杉适,找到它的第一個(gè)不重復(fù)的字符弦聂,并返回它的索引鸟辅。如果不存在氛什,則返回 -1莺葫。
案例:
s = "leetcode"
返回 0.
s = "loveleetcode",
返回 2.
注意事項(xiàng):您可以假定該字符串只包含小寫字母。
分析:
題意很簡單枪眉,給定字符串從左向右捺檬,直到遇到一個(gè)是唯一的字符串,返回此索引值就可以贸铜。
解題的思路可以循環(huán)遍歷做元素是否相同的比較堡纬,但這樣太費(fèi)時(shí)費(fèi)力了聂受。
而根據(jù)題目,對于每一個(gè)元素只關(guān)心是否有重復(fù)元素烤镐,并不關(guān)心有幾個(gè)重復(fù)元素蛋济,所以最簡單的方法就是利用接口 indexOf() 和 lastIndexOf()兩個(gè)接口比對結(jié)果是否一致。
解法一:
List中有indexOf()和lastIndexOf()接口炮叶,我們把String字符串里面的每一個(gè)字符都放入List中碗旅,調(diào)用其相應(yīng)接口進(jìn)行判斷。
Java解答如下:
public int firstUniqChar(String s) {
char[] chars = s.toCharArray();
for (int i = 0; i < chars.length; i++) {
char ch = chars[i];
int index = s.indexOf(ch);
if (index == s.lastIndexOf(ch)) {
return index;
}
}
return -1;
}
解法二:
其實(shí)轉(zhuǎn)換一下腦子的話镜悉,還有更簡單的方法祟辟,因?yàn)榘裇tring字符串放入ArrayList中需要耗費(fèi)不少時(shí)間和空間,那么就要想辦法避免這些消耗侣肄。別忘了題目還給了一個(gè)限制條件旧困,字符串都是小寫的,那么我們就可以確定字符串中每一個(gè)字符的范圍是從 a
到 z
的稼锅,我們可以遍歷字符 a
到 z
吼具,然后判斷每一個(gè)字符在字符串里面是否存在,如果存在判斷其indexOf()和lastIndexOf()的值是否相同矩距,最后在找出index值最小的結(jié)果馍悟,就是題目所求結(jié)果。
Java解答如下:
public int firstUniqChar(String s) {
int result = -1;
for (char ch = 'a'; ch <= 'z'; ch++) {
int index = s.indexOf(ch);
if (index != -1 && index == s.lastIndexOf(ch)) {
result = (result == -1) ? index : Math.min(result, index);
}
}
return result;
}