【发布时间】:2014-03-23 08:09:19
【问题描述】:
我正在解决这个问题: 编写一个接收字符串并打印第一个非重复字符的函数。换句话说,我需要找到在整个字符串中只出现一次的第一个字符。 我知道解决方案已经可用,但以下是我编写的代码:
#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;
void main()
{
string S1;
int NonRepeatElement,StringLenght,temp;
unordered_map <char, int> ElementMap;
unordered_map<char,int>::iterator it;
char KeyValue;
cout<<"Please enter your string"<<endl;
cin>>S1;
StringLenght=S1.length();
NonRepeatElement=0;
for(int i=0;i<StringLenght;i++)
{
if(ElementMap.find(S1[i]) == ElementMap.end())
ElementMap[S1[i]]=1;
else
ElementMap.find(S1[i])->second++;
}
for(it=ElementMap.begin();it!=ElementMap.end();++it)
{
if(it->second==1)
{ KeyValue=it->first;
break;
}
}
for(int i=0;i<StringLenght;i++)
{
if(S1[i]==KeyValue)
{
cout<<"First Non Repeating character is "<<S1[i]<<endl;
break;
}
}
}
现在我确实得到了只出现一次的元素,但它不是第一个真正的元素,而是它的第一个排序元素。 例如。如果输入字符串是 zaaabbcccdjjj 那么输出是 d 而不是 z 谁能提出为什么甚至 unordered_map 的行为是这样的?
【问题讨论】:
-
第一个非重复字符是指与相同字符值不相邻的字符吗? IE。如果定义正在寻找一些“cc”而不是“cac”,则“abcac”有 no 个“重复”字符。两者都是可以解决的,但是解决方案将完全不同,因此请澄清您的问题(您似乎试图解释后者而不是前者)。我希望这种情况下的白话是“找到第一个 unique 字符”。
-
是的,你是对的。我编辑了我的问题。它实际上是“找到第一个独特的字符”。
-
好的。那么答案是在构建地图后不要通过迭代枚举地图。再次枚举字符串,通过映射
find方法搜索第一个条目,该方法的计数为1。如果您需要下面的答案,我会发布它(并且可能无论如何都应该)。 -
哦,太好了。这很好用,但是你能解释一下为什么迭代 map 会给出错误的结果吗? MAP 的哪些功能导致了这种错误行为?
-
地图对 anything 是无序的(当然不完全正确,它是一个哈希映射,但这不是重点,而且看起来
d的哈希较低比z的哈希值)。枚举它将为您提供带有冲突的哈希表排序即使使用有序映射仍然不起作用,因为它只是按字符排序。 字符串中的位置是你感兴趣的。