📅  最后修改于: 2023-12-03 15:16:38.011000             🧑  作者: Mango
Anagram是指由颠倒字母顺序组成的单词。例如,“silent”可以由“listen”颠倒字母顺序组成。在这里,我们将介绍如何在Java中检查两个字符串是否互为Anagram。
实现这个功能的简单方法是,将两个字符串中的字符分别存储在两个HashMap中,并检查它们是否相同。
public static boolean isAnagram(String str1, String str2) {
if (str1.length() != str2.length()) {
return false;
}
Map<Character, Integer> frequencyMap1 = new HashMap<>();
Map<Character, Integer> frequencyMap2 = new HashMap<>();
for (int i = 0; i < str1.length(); i++) {
frequencyMap1.put(str1.charAt(i), frequencyMap1.getOrDefault(str1.charAt(i), 0) + 1);
frequencyMap2.put(str2.charAt(i), frequencyMap2.getOrDefault(str2.charAt(i), 0) + 1);
}
return frequencyMap1.equals(frequencyMap2);
}
此方法使用两个Map(HashMap)将字符串转换为字符和其出现次数的映射。然后,我们检查两个映射是否相同。如果两个字符串的长度不同,则它们不可能是Anagram,并且方法将返回false,否则它将在O(n)时间内遍历字符串并构建频率映射。最后,它在O(1)时间内比较频率映射并返回结果。
接下来是我们如何测试这个方法。我们将创建一个JUnit测试类,并编写以下测试用例:
@Test
public void testIsAnagram() {
assertTrue(AnagramChecker.isAnagram("silent", "listen"));
assertTrue(AnagramChecker.isAnagram("night", "thing"));
assertTrue(AnagramChecker.isAnagram("Astronomer", "Moon starer"));
assertFalse(AnagramChecker.isAnagram("hello", "world"));
assertFalse(AnagramChecker.isAnagram("Java", "JavaScript"));
}
这里我们使用Java中的JUnit测试框架编写测试用例。我们期望前三个测试用例返回true,后两个测试用例返回false。
这是一个简单而有效的方法,可以在Java中检查两个字符串是否互为Anagram。通过将字符和其出现次数映射到HashMap中,我们可以在O(n)时间内构建频率映射,并在O(1)时间内比较它们。这个方法的时间复杂度是O(n),空间复杂度是O(n)。