题目一:字符串中第一个只出现一次的字符
在字符串中找出第一个只出现一次的字符。如输入“abaccdeff”,则输出‘b’。
链接:
剑指Offer(第2版):P243
思路标签:
- 算法:空间换时间
解答:
256个字符的hash表
- C++标准库中,map和unordered_map实现了哈希表的功能;
- 字符是一个长度为8的数据类型,总共有256种可能,所以创建一个长度为256的数组来实现hash的功能即可。
class Solution {
public:
char FirstNotRepeatingChar(char* pString) {
if (pString == nullptr)
return '\0';
const int tableSize = 256;
unsigned int hashTable[tableSize];
for (int i = 0; i < tableSize; ++i)
hashTable[i] = 0;
char* pHashKey = pString;
while (*(pHashKey) != '\0')
hashTable[*(pHashKey++)]++;
pHashKey = pString;
while (*(pHashKey) != '\0') {
if (hashTable[*pHashKey] == 1)
return *pHashKey;
pHashKey++;
}
return '\0';
}
};
题目二:字符流中第一个只出现一次的字符
请实现一个函数,用来找出字符流中第一个只出现一次的字符。
例子:
例如,当从字符流中只读出前两个字符“go”时,第一个只出现一次的字符是‘g’;当从该字符流中读出前6个字符“google”时,第一个只出现一次的字符是’l’。
链接:
剑指Offer(第2版):P247
思路标签:
- 算法:空间换时间
解答:
256个字符的hash表
- 与上面不同的是这是一个流的问题,所以我们分别需要实现插入操作和判断当前元素中只第一个出现一次的字符。
- *
class CharStatistics
{
public:
CharStatistics() : index(0)
{
for (int i = 0; i < 256; ++i)
occurrence[i] = -1;
}
void Insert(char ch)
{
if (occurrence[ch] == -1)
occurrence[ch] = index;
else if (occurrence[ch] >= 0)
occurrence[ch] = -2;
index++;
}
char FirstAppearingOnce()
{
char ch = '\0';
int minIndex = numeric_limits<int>::max();
for (int i = 0; i < 256; ++i)
{
if (occurrence[i] >= 0 && occurrence[i] < minIndex)
{
ch = (char)i;
minIndex = occurrence[i];
}
}
return ch;
}
private:
// occurrence[i]: A character with ASCII value i;
// occurrence[i] = -1: The character has not found;
// occurrence[i] = -2: The character has been found for mutlple times
// occurrence[i] >= 0: The character has been found only once
int occurrence[256];
int index;
};
c++相关:
C++/C++11中std::numeric_limits的使用