查找第一个只出现一次的字符(哈希,队列,find()rfind())

本文介绍了一种使用哈希表和队列的数据结构来高效查找字符串中首次出现且仅出现一次的字符的方法。通过两次遍历,算法能快速定位目标字符,适用于处理字符流或固定字符串。

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

思路:首先看到只出现一次,就想到要用哈希来记录每个字符出现的次数,可以用map或者vector容器等;对于“第一个”这个字眼,首先惯性思维就是使用队列来实现,先进先出,
1.如果处理的对象是一个字符串流,则可通过使用队列来保存出现字符的先后顺序,然后依次弹出队列,并查看map中对于应的出现次数,若为1,则即为结果,程序如下:

class Solution
{
public:
  //Insert one char from stringstream
   
    void Insert(char ch)
    {
        if(m.find(ch)==m.end()){    //find函数若没有查找到这个关键码,则返回尾迭代器
            q.push(ch);
        }
        m[ch]++;//若使用下标关键码进行查询,若没有目标,会创建一个此关键码并将val设置乘默认值
    }
  //return the first appearence once char in current stringstream
    char FirstAppearingOnce()
    {
        while(!q.empty()){
            if(m[q.front()]==1){
                return q.front();
            }
            else
                q.pop();
        }
        return '#';
    }
private:
    map<char, int> m;
    queue<char> q;

};
//思路:问题让求第一次出现的只出现一次的字符,所以有先入先处理的服务,故想到用队列,
//让只求出现一次的字符,需要设计到去重,故用map或者set;
//map用来记录每一个字符出现的次数,queue用来记录字符出现的先后顺序。

其中,map的find函数若没有查找到这个关键码,则返回尾迭代器。
2.如果待处理的字符串是一个string类,可以使用哈希表的方法,依次遍历每一个字符并记录出现次数,然后再遍历一遍字符串并查看对应的哈希表,若哈希表为记录为1,即为结果,同上面的字符流操作思路相同,只不过上面用queue来记录出现的字符,而这里字符串已经给定,无需从字符流中读取。另外,还有另一种方法来实现,就是利用find和rfind两个函数。若两个函数查找同一个字符返回的位置相同,则此字符就是出现一次的字符,从前往后分别验证每一个字符。 注意,find和rfind函数查找成功返回的是字符在字符串中的位置,一个无符号整型,若查找失败,则返回string::npos。其中find
是查找第一次出现的位置,而rfind是查找最后一次出现的位置。代码如下:

class Solution {
public:
    int FirstNotRepeatingChar(string str) {
        int len=str.length();
        for(int i=0;i<len;i++){
           if(str.find(str[i])==str.rfind(str[i]))
               return i;
        }
        return -1;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值