Two strings are called anagrams if they contain same set of characters but in different order. For example,
-
peek and keep are anagrams
-
spar and rasp are anagrams
-
listen and silent are anagrams
Upasana | July 24, 2020 | 2 min read | 1,334 views | Java Coding Challenges
Sort characters within string for both the inputs.
if the two strings are same after sorting, they are anagram else not.
Let’s write Java code that takes this approach and checks if two given inputs are anagrams or not.
import java.util.Arrays;
public class AnagramChecker {
public boolean isAnagram(String input1, String input2) {
char[] sortedWord1 = input1.toCharArray();
Arrays.sort(sortedWord1);
char[] sortedWord2 = input2.toCharArray();
Arrays.sort(sortedWord2);
return Arrays.equals(sortedWord1, sortedWord2);
}
}
Here is the unit test for above method.
import org.junit.Test;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.junit.Assert.*;
public class AnagramCheckerTest {
@Test
public void isAnagram() {
AnagramChecker checker = new AnagramChecker();
assertThat(checker.isAnagram("peek", "keep"), equalTo(true));
assertThat(checker.isAnagram("mary", "army"), equalTo(true));
assertThat(checker.isAnagram("dart", "mart"), equalTo(false));
}
}
Alternatively, we can count the number of characters in both words and compare it for exactness. This approach is slightly efficient, as it has time complexity of Big O(n) compared to Big O(n log n) in earlier case.
public class AnagramEfficient {
public boolean isAnagram(String first, String second) {
int[] letterCount = new int[126];
for (char ch : first.toCharArray()) {
letterCount[ch]++;
}
for (char ch : second.toCharArray()) {
letterCount[ch]--;
}
for (int count : letterCount) {
if (count != 0)
return false;
}
return true;
}
}
Here we are assuming that input is always an ASCII text without unicode support.
We can lowercase the input in both the approaches to make it case-insensitive.