如果两个字符串是字谜,请使用unordered_map确定它们
Determine two strings if they are anagrams using unordered_map
我知道很多问题已经提出了这个问题,但我想在 c++ 中使用 std::unordered_map
来做到这一点。如果有人有一些与我的实现类似的答案,请指出我一些链接。谢谢。
我使用哈希作为计算字符串中字符出现的一种方法,如果两个字符串具有相同数量的相同字符,则使用该函数来比较它们,但我认为我在返回正确的提示时可能会遇到一些问题。
#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 anagramsn";
break;
return 0;
}
cout<<"Strings matchn";
return 0;
}
我希望输出显示"字符串不是字谜",但我得到"字符串匹配">
您在此处的if
语句中缺少大括号:
if(m1[i]!=m2[i])
cout<<"Strings are not anagramsn";
break;
return 0;
所以代码等价于:
for(int i=0;i<=255;i++){
if(m1[i]!=m2[i]) {
cout<<"Strings are not anagramsn";
}
break;
return 0;
}
在第一次比较之后,始终到达break
语句,退出for
循环。
您应该将其替换为:
for(int i=0;i<=255;i++){
if(m1[i]!=m2[i]) {
cout<<"Strings are not anagramsn";
return 0;
}
}
此外,正如问题评论中所述,区分大小写的测试很奇怪,因为if((int)s[c]
永远是正确的。
你可能想这样写:
for(int c=0;c<s.length();c++){
if(s[c]!=' '){
m[std::toupper(s[c])]++;
}
}
相关文章:
- 如果不是多个语句,请使用 if 语句
- Clang-CL 警告 strnicmp 已弃用,请使用 ISO C 并C++符合标准的名称_strnicmp
- 如果输入缓冲区不为空,请使用getchar.()检测Ctrl+d
- 如果 (QString.contains()) 不能正常工作,请使用 temp bool 变量进行更正
- 如果两个字符串是字谜,请使用unordered_map确定它们
- 使用SEND()之前,请使用Select()检查套接字
- 在编写平台依赖代码时,请使用constexpr代替宏
- 如果元组足够大,请使用sfinae启用方法
- 使用带有boost::program_options的多个源时,请使用最后一个存储值,而不是第一个存储值
- 特征错误:请使用密码保护您的最小值
- 要在不使用cout的情况下打印某些内容,请使用printf或puts()
- 在指定模板类之前,请使用模板类
- 在Fedora 20 x86_64上编译32位Linux应用程序时,请使用SNDFILE库
- C++类型擦除,请使用 std::function 捕获单个类的多个方法
- 对于几乎相似的内容,请使用qml文件
- 如何读取一个不完整的表单字段,请使用C++
- 无法读取文件以进行文件处理,请使用 boost 库获取文件路径
- 如果要在名称列表中搜索名称,请使用QMap或Qlist容器
- 当使用JNI在现有C++代码中进行移植时,请使用C或C++与JAVA进行接口
- 如果可用,请使用模板参数的实现,否则为默认值