【LeetCode】387. 字符串中的第一个唯一字符

这篇博客介绍了如何用O(N)的时间复杂度解决找到字符串里首次出现且仅出现一次的字符的下标问题。通过创建一个计数数组,遍历字符串统计每个字符出现的次数,然后再次遍历字符串找到第一个计数为1的字符的下标。此外,还提供了一个O(N^2)的解决方案作为对比。博客作者希望通过这种方式帮助读者更好地理解和掌握算法技巧。
摘要由CSDN通过智能技术生成

💒越做题越觉得自己是菜鸡

在这里插入图片描述

🧸读题

找到第一个,出现一次的字符,的下标。

🧸代码 O(N)

思路:用映射的方式查找,开一个数组记录每个字幕出现的次数,再找出数组中第一个是1的映射的字符!

class Solution {
public:
    int firstUniqChar(string s) {
        int countArr[26] = { 0 };
        //统计次数
        for (int i = 0; i < s.size(); ++i)
        {
            countArr[s[i] - 'a']++;
        }
        for (int j = 0; j < s.size();++j)
        {
            if (countArr[s[j] - 'a'] == 1)
            {
                return j;
            }
        }
        return -1;
    }
};

🧸解读代码

通过映射的方式解决问题
int countArr[26] = { 0 };

题目说只有小写字母,所以映射的数组直接开26个即可!
并且初始化为0
s中的每个字符映射到,countArr所在的下标,countArr下标存的数字就是 这个字符出现的次数!

for (int i = 0; i < s.size(); ++i)
{
  countArr[s[i] - 'a']++;
}

icountArr数组的下标,范围是s.size()
例如查找l ,假设s[i]存储的是l ,遍历字符数组
'l' - 'a'等于11,也就是l映射到countArr的下标
所以在countArr[11] 的位置上 ++ ,如果l出现两次则在 countArr[11]的位置再++

for (int j = 0; j < s.size();++j)
{
  if (countArr[s[j] - 'a'] == 1)
  {
    return j;
  }
}

这个循环是遍历s字符串
js字符串的下标,范围是s.size()
例如查找l,假设l的位置是s[j]
因为'l' - 'a'等于11,也就是l映射到countArr[]的下标,这个下标存的是l出现的次数!
所以如果countArr[s[j] - 'a'] == 1
那么s[j]中的j就是,只出现一次的l字符,的下标!

🧸我快写蒙圈了,希望你看懂了!!!

🧸其他大佬的解法

这个解法是O(N2)
遍历数组,同时在两头向中间找,如果都找到了并且下标相同,则这个字符在整个s中只出现一次,此时直接返回下标即可

class Solution {
public:
    int firstUniqChar(string s) {
        for(int i = 0;i<s.size();++i)
		{
			if(s.find(s[i]) == s.rfind(s[i]))
			{
				return i;
			}
		}
        return -1;
    }
};

🌈加油,祝你拿到心仪的offer!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值