给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。
示例s = "leetcode"
返回 0
s = "loveleetcode"
返回 2
解- 解法一最简单可以使用HashMap,首先记录每个字符出现的次数,然后再次遍历,找到第value值是1的字符。
public static int firstUniqChar(String s) {
Map<Character, Integer> map = new HashMap<>();
for (int i = 0; i < s.length(); i++) {
map.put(s.charAt(i), map.getOrDefault(s.charAt(i), 0) + 1);
}
for (int i = 0; i < s.length(); i++) {
if (map.get(s.charAt(i))==1){
return i;
}
}
return -1;
}
- 解法二
这种方法很巧妙使用了indexOf和lastIndexOf方法,假设在遍历'a'的时候,indexOf('a')=0,但是lastIndexOf(‘a’)=10,那么最终条件是true && false,结果是false。
在来看在遍历i的时候,indexOf('i')=5,lastIndexOf('i')也=5,运算结果true && true,则赋值res,这里用了三元表达式,如果是第一次进入这个条件,那么res就等于第一次找出的字符下标,如果不是第一次进入这个条件,那么res就不是-1,则进行Math.min(res, index)取下标最小的一个索引。
这里有人问为什么不在条件成立后直接返回index,原因是遍历是从a-z,而字符是乱序的。
public static void main(String args[]) {
System.out.println(firstUniqChar("abcdeiedcba"));
}
public static int firstUniqChar(String s) {
int res = -1;
for (char ch = 'a'; ch <= 'z'; ch++) {
int index = s.indexOf(ch);
if (index != -1 && index == s.lastIndexOf(ch)) {
res = res == -1 ? index : Math.min(res, index);
}
}
return res;
}