确定某物是不是是字谜的功能问题[关闭]
Posted
技术标签:
【中文标题】确定某物是不是是字谜的功能问题[关闭]【英文标题】: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
两次更容易发现。
【参考方案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 时间复杂度基本相同,我知道。代码的空间和大小/简单性如何?以上是关于确定某物是不是是字谜的功能问题[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
代码背后的逻辑确定两个 javascript 字符串是不是是字谜