使用 Java 中的 HashMap 檢查兩個字串是否互為字謎


字謎字串是指那些在每個字串中都具有相同字元的字串,只是它們的排列順序不同。換句話說,如果重新排列另一個字串的字元後形成一個有意義的單詞,則該字串就是一個字謎字串。一些字謎字串的示例是“cat 和 act”、“care 和 race”。它們都具有相同的字元及其頻率。

在本文中,我們將討論使用 Java 中的 HashMap 檢查兩個字串是否互為字謎的方法。

問題陳述

給定兩個字串,我們需要使用 Java 中的雜湊對映檢查這兩個字串是否互為字謎。讓我們舉一個例子來更好地理解它。

Input: str1: care
  str2: race
Output: True 

使用雜湊對映檢查字謎字串的演算法

  • 步驟 1 − 如果兩個字串的長度不相等,則立即返回 false。

  • 步驟 2 − 宣告兩個 HashMap。

  • 步驟 3 − 遍歷第一個字串的元素,並將它們的頻率儲存到第一個雜湊對映中。

  • 步驟 4 − 現在,遍歷第二個字串,並將它們的頻率儲存到第二個雜湊對映中。

  • 步驟 5 − 現在,檢查兩個雜湊對映是否相等。

  • 步驟 6 − 如果是,則返回 true。

  • 步驟 7 − 否則,返回 false。

現在,讓我們討論一些檢查字謎字串的方法。

方法

  • 方法 1 − 該方法使用兩個雜湊對映,並在不同的雜湊對映中儲存兩個字串的頻率計數。如果兩個雜湊對映相等,則這兩個字串互為字謎。

  • 方法 2 − 在第二種方法中,只有一個雜湊對映。首先,第一個字串的頻率計數儲存在雜湊對映中,然後如果第二個字串中出現相同的字元,則遞減頻率。最後,如果雜湊對映的所有值都為零,則這兩個字串互為字謎,否則不是。

方法 1

在這種方法中,我們將討論程式程式碼,以使用 Java 中的兩個 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 中的僅一個 HashMap 檢查兩個給定字串是否互為字謎。雜湊對映首先儲存第一個字串的字元頻率,然後遞減第二個字串的這些頻率。如果雜湊對映的值然後變為 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 檢查兩個字串是否互為字謎的技術。第一種方法使用兩個雜湊對映儲存字元的頻率,而第二種方法只使用一個雜湊對映來解決問題陳述。

更新於: 2023-07-18

1K+ 瀏覽量

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告