字符串中的第一个唯一字符
2020年6月25日
题目来源:力扣
解题
- 数组第一种
用indexOf()方法的灵感来源于昨天赎金信这道题,判断首次出现的字符之后有没有再出现一次,没有就返回这个索引。
class Solution {
public int firstUniqChar(String s) {
if(s==null || "".equals(s)) return -1;
int[] flag=new int[26];
for(int i=0;i<s.length();i++){
char ch=s.charAt(i);
int index=s.indexOf(ch,i+1);
if(index==-1 && flag[ch-'a']==0){
return i;
}
flag[ch-'a']++;
}
return -1;
}
}
- 数组第二种
循环一遍用数组计数,再循环一遍找只有一个值的。
这里很有趣的是发现判断空的代码居然会要了我2ms,以下代码没加判空
class Solution {
public int firstUniqChar(String s) {
int[] count = new int[26];
char[] array = s.toCharArray();
for (char c : array)
count[c - 'a']++;
for (int i = 0; i < s.length(); i++)
if (count[array[i] - 'a'] == 1)
return i;
return -1;
}
}
- 哈希表
class Solution {
public int firstUniqChar(String s) {
if(s==null || "".equals(s)) return -1;
Map<Character,Integer> map=new HashMap<>();
char[] sarray=s.toCharArray();
for(char ch:sarray){
map.put(ch,map.getOrDefault(ch,0)+1);
}
for(int i=0;i<s.length();i++){
if(map.get(sarray[i])==1){
return i;
}
}
return -1;
}
}
哈希表我试着不直接用字符串转字符数组,而是循环一个个转成字符,速度下降了1ms
class Solution {
public int firstUniqChar(String s) {
if(s==null || "".equals(s)) return -1;
Map<Character,Integer> map=new HashMap<>();
int len=s.length();
for(int i=0;i<len;i++){
char ch=s.charAt(i);
map.put(ch,map.getOrDefault(ch,0)+1);
}
for(int i=0;i<len;i++){
if(map.get(s.charAt(i))==1){
return i;
}
}
return -1;
}
}