給定一個字符串,找到它的第一個不重復的字符,并返回它的索引。如果不存在,則返回 -1。
案例:
s = "leetcode"
返回 0.
s = "loveleetcode",
返回 2.
注意事項:您可以假定該字符串只包含小寫字母。
分析:
題意很簡單,給定字符串從左向右,直到遇到一個是唯一的字符串,返回此索引值就可以。
解題的思路可以循環遍歷做元素是否相同的比較,但這樣太費時費力了。
而根據題目,對于每一個元素只關心是否有重復元素,并不關心有幾個重復元素,所以最簡單的方法就是利用接口 indexOf() 和 lastIndexOf()兩個接口比對結果是否一致。
解法一:
List中有indexOf()和lastIndexOf()接口,我們把String字符串里面的每一個字符都放入List中,調用其相應接口進行判斷。
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;
}
解法二:
其實轉換一下腦子的話,還有更簡單的方法,因為把String字符串放入ArrayList中需要耗費不少時間和空間,那么就要想辦法避免這些消耗。別忘了題目還給了一個限制條件,字符串都是小寫的,那么我們就可以確定字符串中每一個字符的范圍是從 a
到 z
的,我們可以遍歷字符 a
到 z
,然后判斷每一個字符在字符串里面是否存在,如果存在判斷其indexOf()和lastIndexOf()的值是否相同,最后在找出index值最小的結果,就是題目所求結果。
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;
}