剑指offer50第一次只出现一次的字符

Posted shiganquan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer50第一次只出现一次的字符相关的知识,希望对你有一定的参考价值。

题目一

在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).

思路

用哈希表来统计每个字符出现的次数,第一次扫描统计时间复杂度为O(n),找出第一个只出现一次的字符时间复杂度为O(1)

class Solution {
public:
    int FirstNotRepeatingChar(string str) {
        map<char, int> mp;
        for(int i = 0; i < str.size(); ++i)
            mp[str[i]]++;
        for(int i = 0; i < str.size(); ++i){
            if(mp[str[i]]==1)
                return i;
        }
        return -1;
    }
};

 

相关题目

一、定义一个函数,输入两个字符串,从第一个字符串中删除在第二个字符串中出现过的所有字符。

例如,第一个字符串为We are students,第二个字符串为aeiou,则处理之后为W r Stdnts

solution:用一个哈希表(或者是数组,索引代表ASCII码)来存储第二个字符串,则扫描第一个字符串时,可以在O(1)时间内判断字符是否在哈希表中。

 

二、定义一个函数,删除字符串中所有重复出现的字符。

例如,输入goole,删除重复的字符之后结果为gole。

solution:可以创建一个布尔型数组来实现简单的哈希表,索引代表ASCII码。

先全部设置为false,遇到一个字母就设置为true,如果第二次扫描到g,发现是true,则出现过了,删除即可。

 

三、在英语中,如果两个单词出现的字母相同,并且每个字母的次数相同,那么两个单词互为变位词。请完成一个函数,判断是不是变位词。

solution:同样也可以用一个哈希表(也可以是数组,索引代表ASCII),初始值全为0。

第一次扫描,遇到一个字母对应+1。

第二次扫描,遇到一个字母对应-1。

最后哈希表中值是否都为0

TIPS:如需要判断多个字符是不是在某个字符串里出现过,或者统计多个字符串出现次数

往往可以用哈希表来实现,并且可以用数组来实现简单哈希表(下标代表ASCII)

 

题目二

请实现一个函数,用来找出字符流中第一个只出现一次的字符。

例如,当字符流只读出go时,第一个出现一次的字符的g

当字符流读出goole时,第一个只出现一次的字符是l

思路

搞清与题一的区别,因为字符只能一个接着一个读出来,因此需要在O(1)时间内插入,以及更新对应值,还是用哈希表。

因为哈希表不能存储顺序,因此还需要一个string来存储依次读入的字符。字符出现一次对应的次数+1。

最后查找第一个只出现一次的字符,只需要沿着string查找每个字符出现的次数即可。

class Solution
{
public:
    string s;
    int hashtable[256] = {0};
  //Insert one char from stringstream
    void Insert(char ch)
    {
        s += ch;
        hashtable[ch]++;
    }
  //return the first appearence once char in current stringstream
    char FirstAppearingOnce()
    {
        int len = s.size();
        for (int i = 0; i < len; i++)
        {
            if (hashtable[s[i]] == 1)
                return s[i];
        }
        return #;
    }
};

 

以上是关于剑指offer50第一次只出现一次的字符的主要内容,如果未能解决你的问题,请参考以下文章

剑指 Offer 50. 第一个只出现一次的字符

剑指offer50第一次只出现一次的字符

[LeetCode]剑指 Offer 50. 第一个只出现一次的字符

算法剑指 Offer 50. 第一个只出现一次的字符

LeetCode(剑指 Offer)- 50. 第一个只出现一次的字符

LeetCode(剑指 Offer)- 50. 第一个只出现一次的字符