【问题标题】:Trouble with function to determine if something is an anagram [closed]确定某物是否是字谜的功能问题[关闭]
【发布时间】:2021-04-16 01:33:08
【问题描述】:

我只是在处理一些关于代码战的挑战。这个特别是关于编写一个函数来确定两个单词是否是字谜 - 这意味着它们包含相同的字母,可能只是乱序。

我对 C++ 很陌生,所以我可能忽略了一些非常基本的东西。这是我编写的代码,当我运行它时,主要使用两个字符串“orang”和“apple”测试 anagram 函数,程序输出 1(true),这意味着它说这两个词不是 anagrams。如果我尝试“橙色”和“苹果”,它会输出正确的 0(false)。基本上,它只是根据单词的长度而不是它们的单个字母数进行比较。

这是我的代码:

#include <iostream> 
#include <bits/stdc++.h>

using namespace std; 

bool isAnagram(std::string test, std::string original){
  //your code here
  map<char, int> freqTest;
  map<char, int> freqOrig;
  for(int i = 0; i < test.length(); i++) {
      char c = tolower(test[i]);
      freqTest[c]++;
  }
  for(int i = 0; i < original.length(); i++) {
      char c = tolower(test[i]);
      freqOrig[c]++;
  }
  
  return freqTest == freqOrig;
}


// Main function 
int main() 
{ 
    string str1 = "orang";
    string str2 = "apple";
    cout<<isAnagram(str1, str2)<<endl;
}

【问题讨论】:

  • 你打错了:你可以通过创建一个函数来创建频率图来分解你的代码,return compute_frequency(test) == compute_frequency(original); 问题可能比你使用test 两次更容易发现。

标签: c++ anagram


【解决方案1】:

非常简单的错误:

for(int i = 0; i < original.length(); i++) {
      char c = tolower(test[i]); //  Should be original[i] instead of test[i]
      freqOrig[c]++;
  }

tolower(test[i]) 更改为tolower(original[i])

【讨论】:

  • 谢谢!我不敢相信我没有注意到这一点。
  • @Ricky 如果你打印了地图,你会的;)
【解决方案2】:

你正在使用太多的力量来解决一个简单的问题。您可以只使用一个映射,添加一个字符串并减去另一个字符串,然后检查映射中的任何值是否不同于 0。

您也可以将字符串替换为小写,排序然后比较。

#include <algorithm>

for(int i = 0; i < test.size(); i++)
    test[i] = tolower(test[i]);
for(int i = 0; i < original.size(); i++)
    original[i] = tolower(original[i]);
sort(test.begin(), test.end());
sort(original.begin(), original.end());
return test == original;

【讨论】:

  • “使用不同的算法”有点超出这个问题的范围,imo,特别是因为完全有可能修复提问者方法的实现。
  • 我不明白为什么这会快得多。时间复杂度是一样的。
  • @klutt:在减法期间,如果任何条目变为负数,您就有可能提前退出。如果你这样做,你甚至不必在最后检查非零的地图,因为有两个长度相等的输入,这是一个零和游戏,如果任何条目最终为正,那么必须有至少有一个相应的导致提前退出的负面进入。当然,我假设您首先比较长度,以便真正轻松地提前退出。
  • @NathanPierson 我说他可以只用一张地图,同样的算法。然后我提出了一个更简单的方法来实现他想要的
  • @klutt 时间复杂度基本相同,我知道。代码的空间和大小/简单性如何?
猜你喜欢
  • 2013-01-22
  • 2014-09-03
  • 2011-10-01
  • 1970-01-01
  • 2019-05-02
  • 2015-09-28
  • 1970-01-01
  • 2018-09-22
  • 2021-07-30
相关资源
最近更新 更多