【力扣387】字符串中的第一个唯一字符

题目描述:给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回 -1 。

示例 1:

输入: s = “leetcode”
输出: 0

示例 2:

输入: s = “loveleetcode”
输出: 2

示例 3:

输入: s = “aabb”
输出: -1

提示:

  1. 1 <= s.length <= 105
  2. s 只包含小写字母

解题思路一:
我们可以定义一个map集合,key为字符,value为出现的次数,遍历字符串,把每一个字符依次往里放,先统计每个字符出现的次数,然后再遍历原来的字符串查询到第一个出现一次的字符,返回下标即可。

class Solution {
    
    
    public int firstUniqChar(String s) {
    
    
        if(s == null) return -1;
        HashMap<Character,Integer> map = new HashMap<>();
        for(char ch : s.toCharArray()) {
    
    
            if(map.get(ch) == null) {
    
    
                map.put(ch,1);
            }else{
    
    
                int count = map.get(ch);
                map.put(ch,count+1);
            }
        }
        for(int i = 0;i < s.length();i++) {
    
    
            if(map.get(s.charAt(i)) == 1) {
    
    
                return i;
            }
        }
        return -1;
    }
}

在这里插入图片描述
解题思路二:
上面的方法中第二次我们遍历的还是字符串,我们也可以在第二次遍历哈希映射,只需要遍历一次哈希映射中的所有值,找出其中不为 -1的最小值,即为第一个不重复字符的索引。如果哈希映射中的所有值均为 -1,我们就返回 -1,即不存在唯一的字符

class Solution {
    
    
    public int firstUniqChar(String s) {
    
    
        Map<Character, Integer> position = new HashMap<Character, Integer>();
        int n = s.length();
        for (int i = 0; i < n; ++i) {
    
    //第一次遍历字符串
            char ch = s.charAt(i);
            if (position.containsKey(ch)) {
    
    
                position.put(ch, -1);
            } else {
    
    //字符串第一次出现的时候
                position.put(ch, i);
            }
        }
        int m = n;
        for (Map.Entry<Character, Integer> entry : position.entrySet()) {
    
    //第二次遍历哈希映射
            int pos = entry.getValue();
            if (pos != -1 && pos < m) {
    
    
                m = pos;
            }
        }
        if (m == n) {
    
    //不存在唯一的字符
            m = -1;
        }
        return m;
    }
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Mubei1314/article/details/122875394