题目
解法(三种,由慢到快)
第一种,用hashmap
由于hashmap存入键值的顺序和刚开存的时候的顺序基本一直,所以可以凑巧用hashmap。
class Solution {
public int firstUniqChar(String s) {
Map<Character, Integer> map = new HashMap<>();
for (int i = 0; i < s.length(); i++) {
if (map.containsKey(s.charAt(i))) {
map.put(s.charAt(i), map.get(s.charAt(i)) + 1);
} else {
map.put(s.charAt(i), 1);
}
}
for (int i = 0; i < s.length(); i++) {
if(map.get(s.charAt(i))==1) {
return i;
}
}
return -1;
}
}
第二种:空数组记录字母出现的次数
创建一个长度为26的空int数组,用来存s中单一字母出现次数。
class Solution {
public int firstUniqChar(String s) {
int allsindex[]=new int[26];//a~z对应0~25
for(int i=0;i<s.length();i++) {
allsindex[s.charAt(i)-'a']++;//将字母的个数存到allindex中
}
for(int i=0;i<s.length();i++) {//遍历allindex
if(allsindex[s.charAt(i)-'a']==1) {
return i;
}
}
return -1;
}
}
第三种:前后遍历,双指针法。
class Solution {
public int firstUniqChar(String s) {
int index = -1;
int index1 =0;
int index2=0;
for(char i='a';i<='z';i++){
index1 = s.indexOf(a);
index2 = s.lastIndexOf(a);
if(index1==index2&&index1!=-1){//条件x
if(index==-1){
index=999999999;
}
index = Math.min(index,index1);//找到最前面的坐标
/*
lovel
比如先从char i的a开始找,当遍历到i的e的时候,恰好e出现了一次,
满足了条件x,index为3,但是我们要的是o,对应的index为1,所以就用到
了manth.min(),来找到最小的index,也就是在s中最前面出现的index。
*/
}
}
return index;
}
}