HWOJ 在一个字符串中找到第一个只出现一次字符
2014-07-04 12:08
344 查看
HWOJ 在一个字符串中找到第一个只出现一次字符
题目:在一个字符串中找到第一个只出现一次字符测试数据1:bbccdda 样例输出:a
测试数据2:aabbcc 样例输出:.
测试数据3: 0 样例输出:1
题目分析:
①最直观的思路:从头开始扫描这个字符串的每一个字符,当访问到某个字符时拿这个字符和后面的每一个字符进行比较,如果后面没有发现重复的字符,则该字符就是只出现一次的字符。这样做的复杂度为O(n^2),效率太低了。
②由于题目与字符出现的次数有关,我们想着用一个数据容器来存放每个字符出现的次数,在这个数据容器中可以根据字符来查找它出现的次数,容器作用就是吧一个字符映射成一个数字。考虑定义哈希表,哈希表的键值是字符,值时该字符出现的次数。
算法思路:
从头开始扫描字符串两次,第一次扫描字符串时,每扫描到一个字符就在哈希表的对应项中把次数加1;第二次扫描时,每扫描到一个字符就能从哈希表中得到该字符的次数,这样找出只出现一次的。
其实这个就是利用空间复杂度来降低时间复杂度。由于一个包含256个字符的数组,大小1K,大小不变,空间复杂度为O(1);时间复杂度为O(n)。
===============================================================================
参考代码:
//.cpp #include <iostream> const int maxn = 1000; using namespace std; //找出出现一次字符 bool FindChar(char* pInputString, char *pChar) { //输入不合法 if(pInputString == NULL) return 0; //创建一个哈希表,并且初始化 const int tableSize = 256; unsigned int hashTable[tableSize]; for(int i = 0;i < tableSize; i++) hashTable[i] = 0; //确定字符串中每个字符出现的次数 char* pHashKey = pInputString; while(*(pHashKey) != '\0') hashTable[*(pHashKey++)]++; //找到字符串中只出现一次的那个字符 pHashKey = pInputString; while(*pHashKey != '\0') { if(hashTable[*pHashKey] == 1) { *pChar = *pHashKey; return 1; } pHashKey++; } //如果这个字符串为空,或者字符串中的每一个字符至少出现两次 return 0; } int main() { char str[maxn]; char str1[maxn] = {0}; cin >> str; if(FindChar(str,str1) == 0) cout << "." << endl; else cout << str1 << endl; system("pause"); return 0; }
相关文章推荐
- 在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b;
- 在一个字符串中找到第一个只出现一次的字符
- 在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b。
- 17.在一个字符串中找到第一个只出现一次的字符
- 在一个字符串中找到第一个只出现一次的字符
- 在一个字符串中找到第一个只出现一次的字符。
- 在一个字符串中找到第一个只出现一次的字符
- 在一个字符串中找到第一个只出现一次的字符
- 在一个字符串中找到第一个只出现一次的字符
- 在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b。
- 在一个字符串中找到第一个只出现一次的字符(java实现)
- 在一个字符串中找到第一个只出现一次的字符
- 在一个字符串中找到第一个只出现一次的字符
- 每天学习一算法系列(17)(在一个字符串中找到第一个只出现一次的字符)
- 第17 题:题目:在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b。
- 17.在一个字符串中找到第一个只出现一次的字符
- 在一个字符串中找到第一个只出现一次的字符
- 在一个字符串中找到第一个只出现一次的字符
- 在一个字符串中找到第一个只出现一次的字符
- 17、在一个字符串中找到第一个只出现一次的字符