我正在进行在线代码挑战,要求编写一个anagram checker程序。所以我做了以下程序,并且由于一些奇怪的原因,它没有通过所有的测试用例。我自己编写了一个主要功能,并尝试自己测试它,似乎工作正常。
#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;
}
答案 0 :(得分:2)
看起来您的代码会检查str1中的字符是否存在于str2中。
例如,如果str1 =“abca”和str2 =“abcd”,则它们显然不是字谜。
但是它不会将str1变成“****”,因为它会将str1中的最后一个匹配到str2中的第一个a(两次)。
答案 1 :(得分:0)
好的,所以程序不能使用
等输入str2
因此,当您遍历*
中的每个字符时,快速解决方案会在str1
与#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;
}
标记字符。
{{1}}
对于anagram检查器有更好的算法,例如排序和使用hashable。
答案 2 :(得分:0)
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;
}
}