查看两个字符串是不是为 Anagrams [C++]

Posted

技术标签:

【中文标题】查看两个字符串是不是为 Anagrams [C++]【英文标题】:Seeing if Two Strings are Anagrams [C++]查看两个字符串是否为 Anagrams [C++] 【发布时间】:2017-07-14 20:12:51 【问题描述】:

我要编写一个程序,它将接受 2 个字符串,将它们放入一个名为“build_histogram”的函数中,并构建一个 int 数组来计算每个字母在每个字符串中出现的次数,然后比较这些数组,如果它们相等,那么它们是字谜。说明声明我们要忽略所有符号(例如!、空格、_ 等),并且不区分大小写。

#include <iostream>
#include <string>
#include <cctype>
using namespace std;

void build_histogram(int letters[], string s) 

   for(int i = 0; i < s.length(); i++) 
      letters[s[i]]++;
   



int main()

    string s1, s2;
    int* histogram1[26];
    int* histogram2[26];

    cout << "Enter two strings." << endl;
    getline(cin, s1);
    getline(cin, s2);

    build_histogram(histogram1[26], s1);
    build_histogram(histogram2[26], s2);

   if(histogram1 != histogram2) 
      cout << "They are not anagrams." << endl;
   
   else 
      cout << "They are anagrams!" << endl;
   

    return 0;

这是我目前所拥有的,但无论我输入什么字符串,除了“输入两个字符串”之外,我无法让程序打印任何内容。

编辑

所以这是我现在的代码...它正确计算每个字符串中的字符数,现在唯一的问题是底部的“if else”语句仍然无法识别数组是相同的,也像“!”这样的符号很难在字符串中。

#include <iostream>
#include <string>
#include <cctype>
using namespace std;

void build_histogram(int letters[], string s) 

   for(int i = 0; i < s.length(); i++) 
      char currLetter = s[i];
      currLetter = tolower(currLetter);

      int index = currLetter - 97;
      letters[index]++;
   



int main()

    string s1, s2;
    int histogram1[26] = 0;
    int histogram2[26] = 0;

    cout << "Enter two strings." << endl;
    getline(cin, s1);
    getline(cin, s2);

    build_histogram(histogram1, s1);
    build_histogram(histogram2, s2);


   if (histogram1 == histogram2) 
       cout << "They are not anagrams." << endl;
    else 
       cout << "They are anagrams!" << endl;
   

    return 0;

【问题讨论】:

A 的 ASCII 值是 64+1 = 65。a 的 ASCII 值是 64+32+1 = 97。build_histogram 函数是如何工作的? 对不起,我们也忽略大小写。我要编写的函数应该只计算每个字母出现的次数并将其存储在数组中。例如:array[0] 将存储“a” array[1] 将存储“b” 重新考虑int * histogramX[26]; 指向int 的指针数组对您没有多大用处。此外,强烈建议初始化这些数组值。如果您不知道起始值,则很难进行准确的计数。 histogram1 == histogram2 这是比较数组的错误方法。您可以比较两个数组索引处的相应值,也可以使用memcmp(histogram1, histogram2, sizeof(histogram1)*sizeof(int)) == 0 【参考方案1】:

如果两个字符串的长度相同且一个std::is_permutation() 是另一个字符串,则它们是字谜。

见http://en.cppreference.com/w/cpp/algorithm/is_permutation

可以编写一个函数来检查两个字符串是否是这样的字谜:

bool is_anagram(const std::string& s1, const std::string& s2) 
    return s1.size() == s2.size() &&
        std::is_permutation(std::begin(s1), std::end(s1), 
            std::begin(s2), std::end(s2));

【讨论】:

但我的指令说该程序将忽略空格和符号。 (示例输入 1:“ign o r e!pu,c” 输入 2:“erognpcui”;虽然它们的长度不同,并且包含不同的符号,但程序将返回它们是字谜。) 然后在检查之前删除两个字符串中的所有空格。 我们的教授希望我们以一种特定的方式编写它,否则我们将无法获得荣誉......我们还没有学会删除空格,所以我认为我不能这样做并获得满分(我们的老师很蹩脚,宁愿我们按照“他”的方式去做,即使有更好的方法。)【参考方案2】:

这不是您的全部解决方案,但绝对是一个开始。

您的 letters[] 数组只有索引 0 到 25,因此您需要将字母转换为对应于 0-25。

这是一个简单的方法:

void build_histogram(int* letters[], string s) 

   for(int i = 0; i < s.length(); i++) 
      char currLetter = s[i];
      ///force letter to become lowercase
      currLetter = tolower(currLetter);

      ///make letter an ASCII value
      int index = currLetter - 97;//subtract 97 to get a range from 0 to 25
      letters[index]++;
   

此实现将所有字母转换为小写形式。

此外,'a' 的实例数将存储在索引 0 中,'z' 将存储在索引 25 中。

希望这可以帮助您走上正确的道路!

【讨论】:

谢天谢地。我开始写这样的东西,我希望我朝着正确的方向前进!谢谢!

以上是关于查看两个字符串是不是为 Anagrams [C++]的主要内容,如果未能解决你的问题,请参考以下文章

Two Strings Are Anagrams

Two Strings Are Anagrams

比较两个 std::strings 以查看它们是不是匹配 c++ [关闭]

LeetCode 438. Find All Anagrams in a String

CF-1291 D - Irreducible Anagrams

如何判断两个String是否是Anagrams_java实现