1. Problem
An anagram is a word or phrase formed by rearranging the letters of another word or phrase, typically using all the original letters exactly once.
For example:
- ‘Listen’ can be rearranged to form ‘Silent’.
- ‘restful’ can be rearranged to form ‘fluster’.
2. Steps to check if two strings are anagram
- Check if the lengths are the same.
- Normalize the strings (Optional but useful if case sensitivity and spaces don’t matter):
– Convert both strings to lowercase (or uppercase).
– Remove spaces or special characters if necessary. - Sort the letters of both strings alphabetically.
- If the sorted versions of the strings are identical, they are anagrams.
3. Program
import java.util.Arrays; public class AnagramProblem { public boolean solve(char[] s1, char[] s2) { if(s1.length != s2.length) return false; // sort the letters of the strings Arrays.sort(s1); Arrays.sort(s2); // compare letters one by one // Overall running time is O(NlogN) + O(N) = O(NlogN) for(int i=0;i<s1.length;++i) if(s1[i] != s2[i]) return false; return true; } public static void main(String[] args){ String str1 = "silent"; String str2 = "listen"; AnagramProblem anagramProblem = new AnagramProblem(); boolean result = anagramProblem.solve(str1.toCharArray(), str2.toCharArray()); System.out.println(result); } }
Java 8 Anagram Check using Streams
import java.util.Arrays; import java.util.function.Function; import java.util.stream.Collectors; public class AnagramCheck { public static void main(String[] args) { String str1 = "listen"; String str2 = "silent"; boolean isAnagram = areAnagrams(str1, str2); System.out.println("Are Anagrams? " + isAnagram); } public static boolean areAnagrams(String str1, String str2) { if (str1.length() != str2.length()) { return false; // If lengths are different, they can't be anagrams } return Arrays.stream(str1.split("")) .sorted() .collect(Collectors.joining()) .equals( Arrays.stream(str2.split("")) .sorted() .collect(Collectors.joining()) ); } }
Output:
Are Anagrams? true
Explanation:
- Check length: If lengths are different, return
false
. - Convert String to Stream:
str1.split("")
→ Converts the string into an array of characters.Arrays.stream(str1.split(""))
→ Creates a stream from the array.
- Sort characters:
sorted()
- Join back to string:
collect(Collectors.joining())
- Compare sorted versions of both strings.
Alternative Approach: Using Character Frequency Map
You can also check anagrams by counting character occurrences using Collectors.groupingBy()
.
import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; public class AnagramUsingMap { public static void main(String[] args) { String str1 = "triangle"; String str2 = "integral"; boolean isAnagram = getFrequencyMap(str1).equals(getFrequencyMap(str2)); System.out.println("Are Anagrams? " + isAnagram); } public static Map<Character, Long> getFrequencyMap(String str) { return str.chars() .mapToObj(c -> (char) c) .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())); } }