如何检查两个单词是否是字谜

2022-08-31 20:41:14

我有一个程序,告诉你两个词是否是彼此的字谜。有一些例子将无法正常工作,我将不胜感激任何帮助,尽管如果它没有进步,那就太好了,因为我是一个1年级的程序员。“校长”和“教室”是彼此的字谜,但是当我把“教室”改成“theclafsroom”时,它仍然说它们是字谜,我做错了什么?

import java.util.ArrayList;
public class AnagramCheck {
    public static void main(String args[]) {
        String phrase1 = "tbeclassroom";
        phrase1 = (phrase1.toLowerCase()).trim();
        char[] phrase1Arr = phrase1.toCharArray();

        String phrase2 = "schoolmaster";
        phrase2 = (phrase2.toLowerCase()).trim();
        ArrayList<Character> phrase2ArrList = convertStringToArraylist(phrase2);

        if (phrase1.length() != phrase2.length()) {
            System.out.print("There is no anagram present.");
        } else {
            boolean isFound = true;
            for (int i = 0; i < phrase1Arr.length; i++) {
                for (int j = 0; j < phrase2ArrList.size(); j++) {
                    if (phrase1Arr[i] == phrase2ArrList.get(j)) {
                        System.out.print("There is a common element.\n");
                        isFound =;
                        phrase2ArrList.remove(j);
                    }
                }
                if (isFound == false) {
                    System.out.print("There are no anagrams present.");
                    return;
                }
            }
            System.out.printf("%s is an anagram of %s", phrase1, phrase2);
        }
    }

    public static ArrayList<Character> convertStringToArraylist(String str) {
        ArrayList<Character> charList = new ArrayList<Character>();
        for (int i = 0; i < str.length(); i++) {
            charList.add(str.charAt(i));
        }
        return charList;
    }
}

答案 1

如果两个单词包含相同数量的字符和相同的字符,则它们是彼此的字谜。您只需要按词典顺序对字符进行排序,并确定一个字符串中的所有字符是否都等于另一个字符串中的所有字符,并且顺序是否相同

下面是一个代码示例。查看 API 中的数组以了解此处发生了什么。

public boolean isAnagram(String firstWord, String secondWord) {
     char[] word1 = firstWord.replaceAll("[\\s]", "").toCharArray();
     char[] word2 = secondWord.replaceAll("[\\s]", "").toCharArray();
     Arrays.sort(word1);
     Arrays.sort(word2);
     return Arrays.equals(word1, word2);
}

答案 2

最快的算法是将26个英文字符中的每一个映射到一个唯一的素数。然后计算字符串的乘积。根据算术的基本定理,2个字符串是字谜,当且仅当它们的乘积相同。