anagram检查器没有通过所有测试用例?

时间:2017-04-28 01:53:03

标签: string anagram

我正在进行在线代码挑战,要求编写一个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;
}

3 个答案:

答案 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;
    }

}