Java 使用HashMap检查两个字符串是否互为Anagram
Anagram Strings是具有相同字符但排列顺序不同的字符串。换句话说,如果一个字符串在重新排列另一个字符串的字符后形成一个有意义的单词,则该字符串是一个anagram字符串。一些anagram字符串的示例是”cat and act”,”care and race”。它们都具有相同的字符和频率。
在本文中,我们将讨论使用HashMap在Java中检查两个字符串是否互为anagram的方法。
问题陈述
给定两个字符串,我们需要使用HashMap在Java中检查这两个字符串是否互为anagram。让我们举一个示例来更好地理解。
Input: str1: care
str2: race
Output: True
使用HashMap检查字谜字符串的算法
- 步骤1 − 如果两个字符串的长度不相等,立即返回false。
-
步骤2 − 声明两个HashMap。
-
步骤3 − 遍历第一个字符串的元素,并将它们的频率存储到第一个HashMap中。
-
步骤4 − 现在,遍历第二个字符串,并将其频率存储到第二个HashMap中。
-
步骤5 − 现在,检查两个HashMap是否相等。
-
步骤6 − 如果是,则返回true。
-
步骤7 − 否则,返回false。
现在,让我们讨论一些检查字谜字符串的方法。
方法
- 方法1 − 这种方法使用两个HashMap,并将两个字符串的频率计数存储在不同的HashMap中。如果两个HashMap相等,则两个字符串互为字谜。
-
方法2 − 在第二种方法中,只有一个HashMap。首先,将第一个字符串的频率计数存储在HashMap中,然后如果第二个字符串中出现相同字符,则频率递减。最后,如果HashMap的所有值都为零,则两个字符串互为字谜,否则不是。
方法1
在这种方法中,我们将讨论使用两个HashMap在Java中检查两个给定字符串是否互为字谜的程序代码。第一个HashMap存储第一个字符串的字符频率,第二个HashMap存储第二个字符串的字符频率。然后,我们检查两个HashMap是否相等,如果相等,则字符串互为字谜,否则不是。
下面是相同的程序代码。
程序代码
import java.util.*;
public class Main
{
public static boolean checkAnagram(String s1, String s2)
{
if (s1.length() !=s2.length()) {
return false;
}
//Declaration of the HashMaps
HashMap<Character, Integer> mp1 = new HashMap<>();
HashMap<Character, Integer> mp2 = new HashMap<>();
for (int i = 0; i < s1.length(); i++) {
if (mp1.containsKey(s1.charAt(i))) {
mp1.put(s1.charAt(i), mp1.get(s1.charAt(i)) + 1);
}
else {
mp1.put(s1.charAt(i), 1);
}
}
for (int i = 0; i < s2.length(); i++) {
if (mp2.containsKey(s2.charAt(i))) {
mp2.put(s2.charAt(i), mp2.get(s2.charAt(i)) + 1);
}
else {
mp2.put(s2.charAt(i), 1);
}
}
//Checking if the hashmaps are equal or not
if(mp1.equals(mp2)){
return true;
}
else{
return false;
}
}
public static void main(String[] args)
{
String a = "acra";
String b = "cary";
if (checkAnagram(a, b))
System.out.print("True");
else
System.out.print("False");
}
}
输出
False
上述方法的复杂度如下:-
时间复杂度 - O(N)
空间复杂度 - O(2N)
方法2
使用两个哈希映射会增加之前方法的复杂度,因此,现在我们将讨论另一个方法,在该方法中,只使用一个哈希映射来找出两个字符串是否是变位词。
在这个方法中,我们将讨论使用Java中只有一个哈希映射来检查两个给定字符串是否是变位词的程序代码。哈希映射首先存储第一个字符串的字符频率,然后对于第二个字符串递减这些频率。如果哈希映射的值变为0,则字符串是变位词。
以下是相同的程序代码。
程序代码
import java.util.*;
public class Main
{
public static boolean checkAnagram(String s1, String s2)
{
if (s1.length() != s2.length()) {
return false;
}
//Declaration of the HashMap
HashMap<Character, Integer> mp = new HashMap<>();
for (int i = 0; i < s1.length(); i++) {
if (mp.containsKey(s1.charAt(i))) {
mp.put(s1.charAt(i), mp.get(s1.charAt(i)) + 1);
}
else {
mp.put(s1.charAt(i), 1);
}
}
for (int i = 0; i < s2.length(); i++) {
if (mp.containsKey(s2.charAt(i))) {
mp.put(s2.charAt(i), mp.get(s2.charAt(i)) - 1);
}
else {
return false;
}
}
for (Character key : mp.keySet()) {
if (mp.get(key) != 0) {
return false;
}
}
return true;
}
public static void main(String[] args)
{
String a = "care";
String b = "race";
if (checkAnagram(a, b))
System.out.print("True");
else
System.out.print("False");
}
}
输出
True
上述方法的复杂度如下 –
时间复杂度 − O(N)
空间复杂度 − O(N)
结论
在本文中,我们讨论了使用Java中的HashMap来检查两个字符串是否是变位词的两种技术。第一种方法使用两个HashMap来存储字符的频率,而第二种方法仅使用一个HashMap来解决问题。