题目
给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回 -1 。
示例1
输入: s = “leetcode”
输出: 0
示例2
输入: s = “loveleetcode”
输出: 2
解题思路
方法一:哈希表中的HashMap来解决本题
1,第一遍遍历,得到出现字符及其出现的次数。
2,第二遍遍历,遇到第一个出现次数为1的字符,返回其索引。
本题中会用到HashMap的getordeafault()方法
这是这个方法的源码
@Override
public V getOrDefault(Object key, V defaultValue) {
Node<K,V> e;
return (e = getNode(hash(key), key)) == null ? defaultValue : e.value;
}
即如果一个HashMap类型的集合中存在Object key,就返回该key对应的value;
如果不存在Object key,就返回默认值 V defaultValue。
代码
public int firstUniqChar(String s) {
HashMap<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;
}
就是时间复杂度有点高。
方法二:数组记数
public int firstUniqChar(String s) {
int []ans=new int[26];
for(int i=0;i<s.length();i++){
ans[s.charAt(i)-'a']++;
}
for(int i=0;i<s.length();i++){
if(ans[s.charAt(i)-'a']==1){
return i;
}
}
return -1;
}
这个方法的运行时间是6ms,而用HashMap来解,是32ms,这俩种方法在思路上没有大的出入。
翻了翻题解的评论区,好像是因为哈希表主要是牵扯到建表,hash冲撞等事件,所以比较慢。