我知道很多问题已经引起了这个问题,但是我想在c ++中使用std::unordered_map
来解决这个问题。如果有人对我的实现有类似的答案,请指向我一些链接。谢谢。
我使用散列法来计算字符串中字符的出现次数,并使用该函数比较两个字符串(如果它们具有相同数目的相同字符),但是我认为返回正确的提示时可能会遇到一些问题。 / p>
#include<iostream>
#include<bits/stdc++.h>
#include<string>
using namespace std;
unordered_map<char,int> countOccurences(string s){
unordered_map<char,int> m;
for(int c=0;c<s.length();c++){
if(s[c]!=' '){
//for type-insensitive counting
if((int)s[c] || (int)s[c] + 32){
m[s[c]]++;
}
}
}
return m;
}
int main(){
string s1,s2;
cout<<"Enter two strings to be checked:\n";
cin>>s1;
cin>>s2;
unordered_map<char,int> m1,m2;
m1 = countOccurences(s1);
m2 = countOccurences(s2);
for(int i=0;i<=255;i++){
if(m1[i]!=m2[i])
cout<<"Strings are not anagrams\n";
break;
return 0;
}
cout<<"Strings match\n";
return 0;
}
我希望输出显示“字符串不是字谜”,但我得到的是“字符串匹配”
答案 0 :(得分:1)
您在if
语句中缺少花括号:
if(m1[i]!=m2[i])
cout<<"Strings are not anagrams\n";
break;
return 0;
所以代码等同于:
for(int i=0;i<=255;i++){
if(m1[i]!=m2[i]) {
cout<<"Strings are not anagrams\n";
}
break;
return 0;
}
第一次比较后,总是会到达break
语句,并退出for
循环。
您应该将其替换为:
for(int i=0;i<=255;i++){
if(m1[i]!=m2[i]) {
cout<<"Strings are not anagrams\n";
return 0;
}
}
此外,如问题注释中所述,区分大小写的测试很奇怪,因为if((int)s[c]
将始终为真。
您可能想这样写:
for(int c=0;c<s.length();c++){
if(s[c]!=' '){
m[std::toupper(s[c])]++;
}
}