如果两个字符串是字谜,请使用unordered_map确定它们

Determine two strings if they are anagrams using unordered_map

本文关键字:unordered 请使用 map 两个 字符串 如果      更新时间:2023-10-16

我知道很多问题已经提出了这个问题,但我想在 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])]++;
    }
}