×

Anagram Program in Java using String

Anagram Program in Java

Anagrams are those words that are generated by rearrangement of the letters of another phrase or word. Usually, while doing the rearrangement, the original letters are used only once. Anagrams are case-insensitive. Some examples of anagrams are:

Real fun = Funeral.

Elegant man = A Gentleman.

Voices rant on = Conversation.

Dirty room = Dormitory.

The classroom = School master.

The eyes = They see.

Silent = Listen.

Let’s observe the following program that illustrates how to check the two given strings are anagrams of each other or not.

Filename: AnagramStringExample.java

public class AnagramStringExample
{             
public static boolean areAnagrams(String a, String b)
{
               //Removing blank spaces
               String str1 = a.replaceAll("\\s", "");
               String str2 = b.replaceAll("\\s", "");
               //if lengths of strings are not equal, we are done.
               if(str1.length() != str2.length())
                               return false;
               //Handling the case-insensitivity scenario
               char[] arrStr1 = str1.toLowerCase().toCharArray();
               char[] arrStr2 = str2.toLowerCase().toCharArray();
               // Sorting the character arrays.
               Arrays.sort(arrStr1);
               Arrays.sort(arrStr2);
               return Arrays.equals(arrStr1, arrStr2); //Comparing strings and returning result
}
public static void main(String[] args)
{
               String s1 = "Elegant Man", s2 = "A Gentleman";
               if(areAnagrams(s1, s2))
                               System.out.println("The given strings are anagrams of each other.");
               else
                               System.out.println("The given strings are not anagrams of each other.");
}
}

Output:

The given strings are anagrams of each other.

Explanation:

We have written the areAnagrams() method to find out the anagram strings. In the method, we remove the blank spaces as blank spaces do not take part in finding anagrams. After that, we check the length of the strings. If the string length-comparison results false, that means there are some extra characters is any one of the strings.

Hence, the given strings can never be anagrams, and we stop right there. If the comparison returns true, then we have to check the arrangements of letters. At this step, first, we deal with the case sensitivity of strings by changing each character of string into small-case then we do the sorting of character arrays so that every string has the same arrangement.

We changed the strings into character arrays because we do not have sorting methods in the Java String class. Finally, we make a comparison of character arrays and return the result.

Let us discuss one more approach, which is better than the above one in some cases.

Another Approach To Check Anagrams

Filename: AnagramStringExample1.java

public class AnagramStringExample1
{             
public static boolean areAnagrams(String a, String b)
{
               //Removing blank spaces
               String str1 = a.replaceAll("\\s", "");
               String str2 = b.replaceAll("\\s", "");
               //if lengths of strings are not equal, we are done.
               if(str1.length() != str2.length())
                               return false;
               //Handling the case-insensitivity scenario
               char[] arrStr1 = str1.toLowerCase().toCharArray();
               char[] arrStr2 = str2.toLowerCase().toCharArray();
               int[] arr1 = new int[65536];
               int[] arr2 = new int[65536];
               //storing key-value pair
               for(int i = 0; i < arrStr1.length; i++)
               {
                               arr1[arrStr1[i]]++;
                               arr2[arrStr2[i]]++;              
               }
               //comparing values of the integer arrays
               for(int i = 0; i < 65536; i++)
               {
                               if(arr1[i] != arr2[i])
                                              return false;
               }
               return true;
}
public static void main(String[] args)
{
               String s1 = "Elegant Man", s2 = "A Gentleman";
               if(areAnagrams(s1, s2))
                               System.out.println("The given strings are anagrams of each other.");
               else
                               System.out.println("The given strings are not anagrams of each other.");
}
}

Output:

The given strings are anagrams of each other.

Explanation: In this approach, we are using the technique of hashing to find the anagrams. In the previous approach, we used sorting to settle on the common arrangement for both the string. In this approach, we store the character as key and its frequency as the value in the two integer arrays, one array for each string. Finally, we compare values stores in the integers arrays to find the anagrams. At a particular index, if any value of the integer arrays differs, we are done.

Let us understand how to generate and store a key-value pair. Suppose we have a string “keen”. Then, the key-value pair will be:

KeyValue
k1
e2
n1

In an integer array, we will store arr[‘k’] = 1, arr[‘e’] = 2, arr[‘n’] = 1. Since the index of an array is always a whole number, therefore, ‘k’ internally gets converted to its ASCII value 107. ‘e’ gets 101 and ‘n’ gets 110. Thus, we have arr[107] = 1, arr[101] = 2, arr[110] = 1. Note that the size of a character in Java is 2 bytes. Therefore, the range of characters Java handles is 216 = 65536. Therefore, we have declared the size of integer arrays as 65536.

Comparison Between The Above Two Approaches

The major difference between the above two approaches is the first one relies on the sorting technique, while the latter one deals with hashing (storing key-value pair). The sorting approach does very well when the size of the string is small. However, the time consumption increases logarithmic times the size of the string when the size of the string increases. Therefore, for very large strings, the first approach takes a lot of time. 

In the second approach, storing key-value pairs is directly dependent on the size of the character array, which, in turn, is dependent on the size of the given string. Thus, for the larger strings, time consumption increases linearly, not logarithmically times the size of the string. Also, the loop that compares values runs 65536 times, which is irrespective of the size of the string. Thus, even for a string comprising of only 3-4 characters, the comparison-loop runs 65536 times, which is quite bad, but when we have a string containing millions or billions of characters, then 65536 times looks very good.

Conclusion: Hence, for the smaller strings, the first approach should be taken into consideration. The latter takes precedence when the string length is large.


Related Topics

Java Default Keyword

The Default keyword in java programming language is used as access modifier.If any of the variable or the constructor or the methods or the classes are not assigned with the...

3 minutes read.

Convert JSON File to String in Java

Before understanding the conversion of JSON file to string, one must know about JSON. What is JSON? JSON stands for JavaScript Object Notation. It is an open standard format lightweight, text-based, and...

3 minutes read.

How to Assign Static Value to Date in Java?

In this tutorial, we will learn certain ways to assign a static value to a date in java. We will see the limitation of each method that will lead to...

3 minutes read.

Difference between String and Char Array in Java

We are heading to examine some significant differences between String and Character arrays. Both char arrays and String hold the series of characters and are utilised as a cluster of...

3 minutes read.

How to avoid deadlock in java

Deadlock: A deadlock is an event that never going to occur. In java, deadlock is just a part of the multithreading. It is an environment that allows us to run multiple...

4 minutes read.

How to make Java Projects

Ant and Maven are both offered by NetBeans for the development of Java applications. When using Ant, the IDE creates an Ant build script depending on the settings you select...

6 minutes read.

Java Strictfp Keyword

Strictfp is used to impose limits on floating-point calculation. It ensures that we will get the same result on every platform while performing an operation with the floating-point variable. The floating-point calculation is platform-dependent due...

1 minute read.

Swing Program in Java

Java Swing is part of Java Foundation Classes (JFC). The swing toolkit is used to generate Graphical User Interface (GUI) for programs written in Java. The Java swing API is...

4 minutes read.

Java Read File Line by line

Java provides two options to read files line by line. Each option offers different benefits and has its own set of drawbacks. Following are the ways through which on accomplish...

5 minutes read.

Java Get File Size

There are three ways to get the file size in Java. Using Java InputOutput Using NewInputOutput Library Files.size() Method FileChannel.size() Method Using Apache Commons InputOutput Using Java InputOutput: The Java IO package offers the classes that deal...

5 minutes read.

Iccanobif Numbers in Java

In this article, you will be very well equipped with the knowledge of iccanobif numbers in Java. You will also know how they are formed and basic example programs on...

3 minutes read.

Features of Java

The objective of the Java programming language is to provide portability, security, and simplicity. In spite of this, Java has a number of features that makes it a popular language...

5 minutes read.

Fall through in Java

In this article, you will be acknowledged about the fall through condition in Java along with an example program. Fall through It is a situation where there isn't a break statement in...

3 minutes read.

Java Binary Tree

The non-linear data structure known as a binary tree is a type of tree, and because it stores data in a hierarchical manner, it is mostly utilised for finding and...

7 minutes read.

Java Math acos() Method

The acos() method of Math class computes the trigonometric Arc Cosine (inverse of cosine ) of an angle. The value returned is between 0.0 to pi. Syntax: public static double acos(double a) Parameters: The...

1 minute read.

Java Pass-by-Reference

In Java, passing parameters can be done using one of two fundamental methods. Pass-by-value is used for the first and pass-by-reference is used for the second. One thing to keep...

2 minutes read.

Pancake Sorting in Java

In the pancake sorting method, the array must be sorted using just one operation, which is: Flip the arrays arr at index 0 to index j by using flipArr(arr, h). Other sorting...

3 minutes read.

Check whether Java is installed or not

As we know that there are various operating systems, to check whether Java is installed or not in Windows and Mac we use the following ways.           Windows Operating System: There are several...

2 minutes read.

IdentityHashMap in Java

The IdentityHashMap class is comparable to the HashMap class and is an AbstractMap implementation. However, when comparing the key, it uses reference equality rather than object equality (or values). Identity HashMap...

6 minutes read.

How to Convert Date to String in Java

How to Convert Date to String in Java We need to convert Date to String in Java may for displaying purpose. We can convert Date to String in Java using the format() method of java.text.DateFormat class. There...

2 minutes read.