检查字符串数组输入的Anagram

这是我下面的代码,用于检查给定字符串数组的字谜。
即使在最简单的情况下,只有一个输入,它总是给我假。
我不明白我没有正确地将字符串数组转换为字符串,或者我的算法是完全错误的。

public class anagram { static boolean isAnagram(String[] s1, String[] s2) { String str = s1.toString(); String str2 = s2.toString(); if (str.length() != str2.length()) return false; for (int i =0; i<str.length();i++) { for (int j = 0;j<str2.length();j++) { if (s1[i] == s2[j]) { return true; } return false; } } return true; } public static void main(String [] args){ String [] s1 = {"shot"}; String [] s2 = {"host"}; System.out.println(isAnagram(s1,s2)); } } 

你能帮我辨别出什么问题吗?

您的检查算法似乎有点不正确。
在这里编辑了isAnagram函数:

 public static void main(String[] args) { String s1 = "shotaabb"; String s2 = "hostbaba"; System.out.printf("String s1: %s, String s2: %s%n", s1, s2); System.out.println(isAnagram(s1, s2) ? "Is anagram" : "Is not an anagram"); } static boolean isAnagram(String s1, String s2) { String str1 = new String(s1); String str2 = new String(s2); // Ensures that both strings are of the same length if (str1.length() != str2.length()) return false; int str1Len = str1.length(); for (int i = 0; i < str1Len; i++) { int charIndex = str2.indexOf(str1.charAt(i)); if(charIndex == -1) // Not found in str2 return false; else { // Remove the character from str2 str2 = str2.substring(0, charIndex) + str2.substring(charIndex + 1); } } return true; } 

代码的作用是:

  • 从s1获取一个字符,在s2中查找该字符的索引
  • 如果索引为-1,则在s2中找不到字符,则返回false
  • 如果可以在s2中找到该角色,请将其从s2中删除
  • 最后,如果s1中的所有字符都可以在s2中找到,则返回true
  • 基于两个字符串长度相同的事实,如果s1中的所有字符都可以从s2中找到并删除 ,则s1是s2的字谜,反之亦然。

输出:

 String s1: shotaabb, String s2: hostbaba Is anagram 

更新(比较字符串数组):

 String[] strArr1 = {"shot", "dcba"}; String[] strArr2 = {"host", "abcd"}; for(String s1 : strArr1) { for(String s2 : strArr2) { System.out.printf("%nString s1: %s, String s2: %s%n", s1, s2); System.out.println(isAnagram(s1, s2) ? "Is anagram" : "Is not an anagram"); } } 

更新代码的输出:

 String s1: shot, String s2: host Is anagram String s1: shot, String s2: abcd Is not an anagram String s1: dcba, String s2: host Is not an anagram String s1: dcba, String s2: abcd Is anagram 

字符串不是Java中的原始变量,因此必须使用.equals()方法而不是使用“==”检查相等性来执行彻底的比较。

 public static bool IsAnagram(string firstString, string secondString) { firstString = firstString.Replace(" ", "").ToLower(); secondString = secondString.Replace(" ", "").ToLower(); var firstStringArray = firstString.OrderBy(x => x); var secondStringArray = secondString.OrderBy(x => x); string s1 = new string(firstStringArray.ToArray()); string s2 = new string(secondStringArray.ToArray()); if (s1.Equals(s2)) { return true; } else { return false; } } 

要检查两个String是否为anagram,大小写不敏感,此处方法为:

 public boolean isAnagram(String s1, String s2) { class SortChars{ String sort(String source) { char[] chars = source.toLowerCase().toCharArray(); Arrays.sort(chars); return new String(chars); } } SortChars sc = new SortChars(); return sc.sort(s1).equals(sc.sort(s2)); } 

解决方案取自Gayle Laakmann McDowell撰写的“破解编码面试”一书