LeetCode—字符串中的第一个唯一字符(数组两种做法+哈希表)

字符串中的第一个唯一字符

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;
    }
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_41541562/article/details/106958626