剑指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第一次只出现一次的字符的主要内容,如果未能解决你的问题,请参考以下文章
[LeetCode]剑指 Offer 50. 第一个只出现一次的字符