一、第一个只出现一次的字符
题目描述
在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).(从0开始计数)
思路1:蛮力法,时间复杂度O(n^2)
class Solution {
public:
int FirstNotRepeatingChar(string str) {
if (str.length() == 0) return -1;
for (int i = 0; i < str.size(); i++) {\
int count=1;
for(int j=0;j<str.size();j++){
if (i!=j && str[i] == str[j])
count++;
}
if (count == 1) return i;
}
return -1;
}
};
思路2:使用哈希表,记录每个字母出现的次数,然后再输出第一个只出现一次的字母,时间复杂度O(n)
class Solution {
public:
int FirstNotRepeatingChar(string str) {
if (str.length() == 0) return -1;
unordered_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;
}
};
二、字符流中第一个只出现一次的字符
题目描述:
请实现一个函数,找出字符流中第一个只出现一次的字符。
思路:通过数组哈希表统计字符流中每个字符出现的次数,顺便将字符流保存在string中,然后再遍历string,从哈希表中找到第一个出现一次的字符。
#include<iostream>
#include<string>
//#include<unordered_map>
using namespace std;
class Solution {
public:
void Insert(char ch) {
ss += ch; //用string保存输入字符流
count[ch]++; //哈希表记录字符流每个字符出现的次数
}
char FirstApperanceOnce() { //遍历当前字符流,找到第一个第一次出现的字符
for (int i = 0; i < ss.size(); i++) {
if (count[ss[i]] == 1)
return ss[i];
}
return '#';
}
private:
string ss;
int count[256] = { 0 };
};
void test() {
Solution s;
s.Insert('g');
cout << s.FirstApperanceOnce() << endl;
s.Insert('o');
cout << s.FirstApperanceOnce() << endl;
s.Insert('o');
s.Insert('g');
cout << s.FirstApperanceOnce() << endl;
s.Insert('l');
s.Insert('e');
cout << s.FirstApperanceOnce() << endl;
}
int main() {
test();
return 0;
}
总结:当需要判断多个字符是不是在某个字符串里出现过或者统计多个字符在某个字符串中出现的次数,那么我们可以考虑基于数组创建一个简单的哈希表,这样可以用很小的空间消耗换来时间效率的提升!!!