anagram 检查器没有通过所有测试用例?
anagram checker not passing all test cases?
我正在做一个在线代码挑战,要求编写一个变位词检查程序。所以我制作了以下程序,出于某种奇怪的原因,它没有通过所有测试用例。我自己写了一个主要功能,并尝试自己测试它,它似乎工作正常。
#include<iostream>
using namespace std;
bool anagrams(string str1, string str2);
int main(){
string str1="abcd";
string str2="dcba";
cout<<anagrams(str1,str2)<<endl;
cin.get();
return 0;
}
bool anagrams(string str1, string str2){
if(str1.length()!=str2.length()) return false;
for(int i=0;i <str1.length(); i++){
for(int j=0;j<str2.length();j++){
if(str1[i]==str2[j]){
str1[i]='*';
break;
}
}
}
for(int i=0;i<str1.length();i++){
if(str1[i]!='*') return false;
}
return true;
}
您的代码似乎在检查 str1 中的字符是否存在于 str2 中。
例如,如果 str1="abca" 和 str2="abcd" 它们显然不是变位词。
但是,它不会将 str1 变成 "****",因为它会将 str1 中的最后一个 a 与 str2 中的第一个 a 匹配(两次)。
好的,所以该程序不适用于
这样的输入
abcc
abcd
因此,当您遍历 str1
.
中的每个字符时,快速修复方法是将 str2
中的字符标记为 *
#include<iostream>
using namespace std;
bool anagrams(string str1, string str2);
int main(){
string str1="abcc";
string str2="dcba";
cout<<anagrams(str1,str2)<<endl;
cin.get();
return 0;
}
bool anagrams(string str1, string str2){
if(str1.length()!=str2.length()) return false;
for(int i=0;i <str1.length(); i++){
for(int j=0;j<str2.length();j++){
if(str1[i]==str2[j]){
str2[j]='*';
break;
}
}
}
for(int i=0;i<str2.length();i++){
if(str2[i]!='*') return false;
}
return true;
}
有更好的变位词检查器算法,例如排序和使用可哈希值。
package com.datastructures.programs;
public class Anagram {
public static void main(String[] args) {
// TODO Auto-generated method stub
String s1 = "abcc";
String s2 = "abcd";
System.out.println(Anagram.isAnagram(s1, s2));
}
private static boolean isAnagram(String s1, String s2) {
// TODO Auto-generated method stub
int[] temp = new int[256];
boolean isAnagram = true;
if (s1.length() != s2.length()) {
return false;
}
for (char s : s1.toCharArray()) {
int index = (int) s;
temp[index]++;
}
for (char s : s2.toCharArray()) {
int index = (int) s;
temp[index]--;
}
for (int i = 0; i < 256; i++) {
if (temp[i] != 0) {
return false;
}
}
return true;
}
}
我正在做一个在线代码挑战,要求编写一个变位词检查程序。所以我制作了以下程序,出于某种奇怪的原因,它没有通过所有测试用例。我自己写了一个主要功能,并尝试自己测试它,它似乎工作正常。
#include<iostream>
using namespace std;
bool anagrams(string str1, string str2);
int main(){
string str1="abcd";
string str2="dcba";
cout<<anagrams(str1,str2)<<endl;
cin.get();
return 0;
}
bool anagrams(string str1, string str2){
if(str1.length()!=str2.length()) return false;
for(int i=0;i <str1.length(); i++){
for(int j=0;j<str2.length();j++){
if(str1[i]==str2[j]){
str1[i]='*';
break;
}
}
}
for(int i=0;i<str1.length();i++){
if(str1[i]!='*') return false;
}
return true;
}
您的代码似乎在检查 str1 中的字符是否存在于 str2 中。
例如,如果 str1="abca" 和 str2="abcd" 它们显然不是变位词。
但是,它不会将 str1 变成 "****",因为它会将 str1 中的最后一个 a 与 str2 中的第一个 a 匹配(两次)。
好的,所以该程序不适用于
这样的输入abcc
abcd
因此,当您遍历 str1
.
str2
中的字符标记为 *
#include<iostream>
using namespace std;
bool anagrams(string str1, string str2);
int main(){
string str1="abcc";
string str2="dcba";
cout<<anagrams(str1,str2)<<endl;
cin.get();
return 0;
}
bool anagrams(string str1, string str2){
if(str1.length()!=str2.length()) return false;
for(int i=0;i <str1.length(); i++){
for(int j=0;j<str2.length();j++){
if(str1[i]==str2[j]){
str2[j]='*';
break;
}
}
}
for(int i=0;i<str2.length();i++){
if(str2[i]!='*') return false;
}
return true;
}
有更好的变位词检查器算法,例如排序和使用可哈希值。
package com.datastructures.programs;
public class Anagram {
public static void main(String[] args) {
// TODO Auto-generated method stub
String s1 = "abcc";
String s2 = "abcd";
System.out.println(Anagram.isAnagram(s1, s2));
}
private static boolean isAnagram(String s1, String s2) {
// TODO Auto-generated method stub
int[] temp = new int[256];
boolean isAnagram = true;
if (s1.length() != s2.length()) {
return false;
}
for (char s : s1.toCharArray()) {
int index = (int) s;
temp[index]++;
}
for (char s : s2.toCharArray()) {
int index = (int) s;
temp[index]--;
}
for (int i = 0; i < 256; i++) {
if (temp[i] != 0) {
return false;
}
}
return true;
}
}