字符串中的第一个唯一字符
给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。
示例:
s = “leetcode”
返回 0
s = “loveleetcode”
返回 2
提示:你可以假定该字符串只包含小写字母。
解题思路
方法一:HashMap
第一遍先统计每个字符出现的次数,第二遍再次从前往后遍历字符串s中的每个字符,如果某个字符出现一次直接返回。这里使用的是HashMap实现。利用其getOrDefault() 方法,来统计字符出现的次数。
getOrDefault(): 方法获取指定 key 对应对 value,如果找不到 key ,则返回设置的默认值。
getOrDefault() 方法的语法为:
hashmap.getOrDefault(Object key, V defaultValue)
注:hashmap 是 HashMap 类的一个对象。
参数说明:
- key - 键
- defaultValue - 当指定的key并不存在映射关系中,则返回的该默认值
代码实现
public int firstUniqChar(String s) {
Map<Character, Integer> map = new HashMap();
char[] chars = s.toCharArray();
for (char ch : chars) {
map.put(ch, map.getOrDefault(ch, 0) + 1);//统计每个字符的次数,默认零,出现一次加一次
}
//然后在遍历字符串s中的字符,如果出现次数是1就直接返回
for (int i = 0; i < s.length(); i++) {
if (map.get(chars[i]) == 1) {
return i;
}
}
return -1;
}
方法二:使用Java的api
利用java中的查找方法indexOf()和lastIndexOf()来实现,下面先介绍这两个方法
indexOf(int ch): 返回指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。
lastIndexOf(int ch): 返回指定字符在此字符串中最后一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。
一个是查字符第一次出现的,一个是查字符最后一次出现的,当二者下标重叠,那么该字符就是字符串中第一个唯一的字符。返回当前下标位置。下面是代码的实现
public int firstUniqChar(String s) {
for (int i = 0; i < s.length(); i++)
if (s.indexOf(s.charAt(i)) == s.lastIndexOf(s.charAt(i)))
return i;
return -1;
}