leetcode:387. 字符串中的第一个唯一字符

题目

在这里插入图片描述

解法(三种,由慢到快)

第一种,用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;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_42405666/article/details/89607147