JZ50 第一个只出现一次的字符

160 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 7 天,点击查看活动详情

Day34 2023/02/09

题目链接

难度:简单

题目

在一个长为 字符串中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).(从0开始计数)

数据范围:0≤n≤10000,且字符串只有字母组成。

要求:空间复杂度O(n),时间复杂度 O(n)

示例1

输入:"google"
返回值:4
示例2
输入:"aa"
输出:-1

思路一


本题首先想到的就是使用哈希法,因为是为了快速判断一个集合中是否存在某个元素的时候,往往先考虑哈希法。对于本题我们只需要统计每个字符在字符串中出现的频率,这里使用哈希表统计,然后再遍历哈希表找到第一个只出现一次的字符,返回位置即可。
具体做法:

  1. 遍历一次字符串,对于每个字符,利用哈希表统计出现的次数。
  2. 再次遍历字符串,检查哈希表中value值为1的元素,找到第一个即可,若没有则返回-1。

关键点


  • 这里字符作为哈希表的key值,value值为字符出现的次数。

算法实现


c++代码实现-哈希法

#include <unordered_map>
class Solution {
public:
    int FirstNotRepeatingChar(string str) {
        unordered_map<char,  int> cal; //辅助哈希表
        for (int i = 0; i < str.length(); i++) cal[str[i]]++; //统计每个字符出现的次数
        for (int i = 0; i < str.length(); i++) { //找出第一个仅出现一次的字符
            if(cal[str[i]] == 1) return i; //返回其位置
        }
        return -1; //没找到
    }
};
  • 时间复杂度 O(n)O(n) --- 遍历字符串中所有字符,n为字符串长度
  • 空间复杂度 O(n)O(n) --- 辅助哈希表存储了所有字符信息,n为字符串长度

总结

  • 哈希表是一种根据关键码(key)直接访问值(value)的一种数据结构。而这种直接访问意味着只要知道key就能在O(1)时间内得到value,因此哈希表常用来统计频率、快速检验某个元素是否出现过等。