字谜程序测试
Anagram Program Testing
我的 Anagram 程序在我的 dev-cpp 中运行良好,但在任何在线测试器中,任何测试 Anagram 都会抛出错误答案。有人可以帮助我吗?
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
char input1[10000];
char input2[10000];
cin >> input1;
getchar();
cin >> input2;
getchar();
int leng;
leng = strlen(input1);
bool output[leng];
for(int i=0; i<leng; i++){
for(int y=0; y<leng; y++){
if( input1[i] == input2[y] ){
output[i] = true;
}
}
}
for(int o=0; o<leng; o++ ){
if( (o+1) == leng){
if( output[o] == true){
cout << "ano" << endl;
break;
}
}else if(output[o] == true) {
continue;
}
cout << "nie" << endl;
break;
}
getchar();
return 0;
}
您的算法有问题。想象一下以下场景:
Input1: ab
Input2: cdefab
您的算法 return 可以,因为它只会检查 input1 的 a 和 b 字符是否出现在 input2 中。
与示例相同的问题,例如:
Input1: aaaaaa
Input2: a
或:
Input1: aaaab
Input2: bbbba
您可以通过以下方式更改算法:
- 使用 256 数组(您的字符在 ASCII 中的索引)对字符进行计数
int
初始化为 0。输入 1 递增,输入 2 递减,最后您的数组应填充 0。O( n) 算法
- 对您的两个输入进行排序并逐个字符地比较它们。 O(n^2) 算法
您可以找到有关这些算法的更多详细信息 here。
<algorithm>
中有一个巧妙的函数 is_permutation
可以使这个问题变得微不足道,而不是试图重新发明轮子。 .
#include <algorithm>
bool isAnagram(std::string a, std::string b) {
if(a.size() == b.size()) {
return std::is_permutation ( a.begin(), a.end(), b.begin(), [](char x, char y){return std::tolower(x) == std::tolower(y);} );
}
return false;
}
如果您想要区分大小写,只需删除二进制预测。 Try it here
我的 Anagram 程序在我的 dev-cpp 中运行良好,但在任何在线测试器中,任何测试 Anagram 都会抛出错误答案。有人可以帮助我吗?
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
char input1[10000];
char input2[10000];
cin >> input1;
getchar();
cin >> input2;
getchar();
int leng;
leng = strlen(input1);
bool output[leng];
for(int i=0; i<leng; i++){
for(int y=0; y<leng; y++){
if( input1[i] == input2[y] ){
output[i] = true;
}
}
}
for(int o=0; o<leng; o++ ){
if( (o+1) == leng){
if( output[o] == true){
cout << "ano" << endl;
break;
}
}else if(output[o] == true) {
continue;
}
cout << "nie" << endl;
break;
}
getchar();
return 0;
}
您的算法有问题。想象一下以下场景:
Input1: ab
Input2: cdefab
您的算法 return 可以,因为它只会检查 input1 的 a 和 b 字符是否出现在 input2 中。
与示例相同的问题,例如:
Input1: aaaaaa
Input2: a
或:
Input1: aaaab
Input2: bbbba
您可以通过以下方式更改算法:
- 使用 256 数组(您的字符在 ASCII 中的索引)对字符进行计数
int
初始化为 0。输入 1 递增,输入 2 递减,最后您的数组应填充 0。O( n) 算法 - 对您的两个输入进行排序并逐个字符地比较它们。 O(n^2) 算法
您可以找到有关这些算法的更多详细信息 here。
<algorithm>
中有一个巧妙的函数 is_permutation
可以使这个问题变得微不足道,而不是试图重新发明轮子。 .
#include <algorithm>
bool isAnagram(std::string a, std::string b) {
if(a.size() == b.size()) {
return std::is_permutation ( a.begin(), a.end(), b.begin(), [](char x, char y){return std::tolower(x) == std::tolower(y);} );
}
return false;
}
如果您想要区分大小写,只需删除二进制预测。 Try it here