初级算法——字符串中的第一个唯一字符

本文介绍了解决字符串中寻找首个不重复字符问题的三种方法:利用哈希表存储字符频数、存储字符索引以及使用String类自带函数。通过具体代码示例展示了不同解法的特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

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

解法一:用哈希表存储频数

        对于这种找重复的问题,我们可以很自然地想到Map,key存字母,value存频数。这里我们学习一下Map中getOrDefault()这个方法的使用,这个方法只需要使用一次就可以减少一次if-else的使用。不用再判断是否存在key值,如果存在得到key对应的value然后加一,如果不存在就把对应的key和0put进去。而是直接使用该方法,如果存在就置value为后面的值,如果不存在就值默认值。

        同时我们还要注意一下第二次循环找数,如果直接使用map的for-each遍历,会导致找不到对应的下标(我第一次就是因为使用了for-each循环而走投无路,最后又改成存索引wuuuuuuuu。。。)

class Solution {
    public int firstUniqChar(String s) {
        Map<Character, Integer> hm = new HashMap<Character, Integer>();
        for (int i = 0; i < s.length(); ++i) {
            char ch = s.charAt(i);
            hm.put(ch, hm.getOrDefault(ch, 0) + 1);
        }
        for (int i = 0; i < s.length(); ++i) {
            if (hm.get(s.charAt(i)) == 1) {
                return i;
            }
        }
        return -1;
    }
}

解法二:用哈希表存数索引

和第一种大同小异

class Solution {
    public int firstUniqChar(String s) {
        HashMap<Character,Integer> m = new HashMap<>();
        for(int i = 0;i < s.length();i++){
            if(m.containsKey(s.charAt(i))){
                m.put(s.charAt(i),-1);
            }
            else{
                m.put(s.charAt(i),i);
            }
        }
        for(int i = 0;i<s.length();i++){
            if(m.get(s.charAt(i)) != -1){
                return i;
            }
        }
        return -1;
    }
}

解法三:使用String类自带库函数

只要正数和倒数的下标一致,证明就只出现一次。

class Solution {
    public int firstUniqChar(String s) {
        for(int i = 0;i < s.length();i++){
            char a = s.charAt(i);
            if(s.indexOf(a) == s.lastIndexOf(a)){
                return i;
            }
        }
        return -1;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值