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

}