题目:
给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。
案例:
s = "leetcode"
返回 0.
s = "loveleetcode",
返回 2.
注意事项:您可以假定该字符串只包含小写字母。
分析:这道题如果要使用数组暴力循环的话,到后面的数据会十分庞大导致运行超时。
方法一: 故使用map集合运算,首先依次将字符串s的每一项都以键值对的形式存入map集合。之后对字符串进行遍历,如果一个字符第一次出现的下标和最后一次出现的下标不一致的话则将map集合中这两项都去除。所以最后map集合中剩下的就只有只出现一次的字符,循环输出第一的字符的下标即可。
代码:
class Solution {
public int firstUniqChar(String s) {
Map<Integer,Character> map = new HashMap<>();
for (int i = 0; i < s.length(); i++){
map.put(i,s.charAt(i));
}
for (int i = 0; i < s.length(); i++){
if (i != s.lastIndexOf(s.charAt(i)) ) {
map.remove(i);
map.remove(s.lastIndexOf(s.charAt(i)));
}
}
if (map.isEmpty()){
return -1;
}else{
for (Integer i : map.keySet()) {
return i;
}
}
return -1;
}
}
方法二:只需要用一个map类存储字母的出现次数,最后遍历map即可
代码:
public static int firstUniqChar(String s) {
Map<Character,Integer> map = new LinkedHashMap<Character,Integer>();
char[] arr = s.toCharArray();
for(int i =0;i<arr.length;i++){
if(!map.containsKey(arr[i])){
map.put(arr[i],i);
}else{
map.put(arr[i],-1);
}
}
for(Map.Entry<Character,Integer> entry :map.entrySet()){
if(entry.getValue()!=-1){
return entry.getValue();
}
}
return -1;
}