为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

SMILET 2019-09-02 08:58:25
我有一个程序,可以显示两个单词是否是彼此的字谜。有一些例子不能正常工作,我会感激任何帮助,虽然如果它不是先进的那将是伟大的,因为我是一年级程序员。“校长”和“教室”是彼此的字谜,然而当我把“教室”改为“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;  }}
查看完整描述

3 回答

?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

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


查看完整回答
反对 回复 2019-09-02
?
largeQ

TA贡献2039条经验 获得超7个赞

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


这是一个代码示例。Arrays在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);

}


查看完整回答
反对 回复 2019-09-02
?
GCT1015

TA贡献1827条经验 获得超4个赞

如果对任一阵列进行排序,则解决方案将变为O(n log n)。但是如果你使用一个hashmap,那就是O(n)。经过测试和工作。


char[] word1 = "test".toCharArray();

char[] word2 = "tes".toCharArray();


Map<Character, Integer> lettersInWord1 = new HashMap<Character, Integer>();


for (char c : word1) {

    int count = 1;

    if (lettersInWord1.containsKey(c)) {

        count = lettersInWord1.get(c) + 1;

    }

    lettersInWord1.put(c, count);

}


for (char c : word2) {

    int count = -1;

    if (lettersInWord1.containsKey(c)) {

        count = lettersInWord1.get(c) - 1;

    }

    lettersInWord1.put(c, count);

}


for (char c : lettersInWord1.keySet()) {

    if (lettersInWord1.get(c) != 0) {

        return false;

    }

}


return true;


查看完整回答
反对 回复 2019-09-02
  • 3 回答
  • 0 关注
  • 785 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信