Check if two strings are k-anagrams or not - GeeksforGeeks

13 Jul, 2021
Given two strings of lowercase alphabets and a value k, the task is to find if two strings are K-anagrams of each other or not.Two strings are called k-anagrams if following two conditions are true. 
Both have same number of characters.Two strings can become anagram by changing at most k characters in a string.
Both have same number of characters.
Two strings can become anagram by changing at most k characters in a string.
Examples :  
Input:  str1 = "anagram" , str2 = "grammar" , k = 3
Output:  Yes
Explanation: We can update maximum 3 values and 
it can be done in changing only 'r' to 'n' 
and 'm' to 'a' in str2.

Input:  str1 = "geeks", str2 = "eggkf", k = 1
Output:  No
Explanation: We can update or modify only 1 
value but there is a need of modifying 2 characters. 
i.e. g and f in str 2.
Method 1: Below is a solution to check if two strings are k-anagrams of each other or not. 
Stores occurrence of all characters of both strings in separate count arrays.Count number of different characters in both strings (in this if a string has 4 a and second has 3 ‘a’ then it will be also counted.If count of different characters is less than or equal to k, then return true else false.
Stores occurrence of all characters of both strings in separate count arrays.
Count number of different characters in both strings (in this if a string has 4 a and second has 3 ‘a’ then it will be also counted.
If count of different characters is less than or equal to k, then return true else false.
C++
Java
Python3
C#
PHP
Javascript
// C++ program to check if two strings are k anagram// or not.#include<bits/stdc++.h>using namespace std;const int MAX_CHAR = 26; // Function to check that string is k-anagram or notbool arekAnagrams(string str1, string str2, int k){    // If both strings are not of equal    // length then return false    int n = str1.length();    if (str2.length() != n)        return false;     int count1[MAX_CHAR] = {0};    int count2[MAX_CHAR] = {0};     // Store the occurrence of all characters    // in a hash_array    for (int i = 0; i < n; i++)        count1[str1[i]-'a']++;    for (int i = 0; i < n; i++)        count2[str2[i]-'a']++;          int count = 0;     // Count number of characters that are    // different in both strings    for (int i = 0; i < MAX_CHAR; i++)        if (count1[i] > count2[i])            count = count + abs(count1[i]-count2[i]);     // Return true if count is less than or    // equal to k    return (count <= k);} // Driver codeint main(){    string str1 = "anagram";    string str2 = "grammar";    int k = 2;    if (arekAnagrams(str1, str2, k))        cout << "Yes";    else        cout<< "No";    return 0;}
// Java program to check if two strings are k anagram// or not.public class GFG {          static final int MAX_CHAR = 26;     // Function to check that string is k-anagram or not    static boolean arekAnagrams(String str1, String str2,                                                 int k)    {        // If both strings are not of equal        // length then return false        int n = str1.length();        if (str2.length() != n)            return false;         int[] count1 = new int[MAX_CHAR];        int[] count2 = new int[MAX_CHAR];        int count = 0;                // Store the occurrence of all characters        // in a hash_array        for (int i = 0; i < n; i++)            count1[str1.charAt(i) - 'a']++;        for (int i = 0; i < n; i++)            count2[str2.charAt(i) - 'a']++;         // Count number of characters that are        // different in both strings        for (int i = 0; i < MAX_CHAR; i++)            if (count1[i] > count2[i])                count = count + Math.abs(count1[i] -                                          count2[i]);         // Return true if count is less than or        // equal to k        return (count <= k);    }     // Driver code    public static void main(String args[])    {        String str1 = "anagram";        String str2 = "grammar";        int k = 2;        if (arekAnagrams(str1, str2, k))            System.out.println("Yes");        else            System.out.println("No");    }}// This code is contributed by Sumit Ghosh
# Python3 program to check if two# strings are k anagram or not.MAX_CHAR = 26 # Function to check that is# k-anagram or notdef arekAnagrams(str1, str2, k) :     # If both strings are not of equal    # length then return false    n = len(str1)    if (len(str2)!= n) :        return False     count1 = [0] * MAX_CHAR    count2 = [0] * MAX_CHAR     # Store the occurrence of all    # characters in a hash_array    for i in range(n):        count1[ord(str1[i]) -               ord('a')] += 1    for i in range(n):        count2[ord(str2[i]) -               ord('a')] += 1             count = 0     # Count number of characters that    # are different in both strings    for i in range(MAX_CHAR):        if (count1[i] > count2[i]) :            count = count + abs(count1[i] -                                count2[i])     # Return true if count is less    # than or equal to k    return (count <= k) # Driver Codeif __name__ == '__main__':    str1 = "anagram"    str2 = "grammar"    k = 2    if (arekAnagrams(str1, str2, k)):        print("Yes")    else:        print("No") # This code is contributed# by SHUBHAMSINGH10
// C# program to check if two// strings are k anagram or not.using System;class GFG {         static int MAX_CHAR = 26;     // Function to check that    // string is k-anagram or not    static bool arekAnagrams(string str1,                             string str2,                                      int k)    {                 // If both strings are not of equal        // length then return false        int n = str1.Length;        if (str2.Length != n)            return false;         int[] count1 = new int[MAX_CHAR];        int[] count2 = new int[MAX_CHAR];        int count = 0;                 // Store the occurrence        // of all characters        // in a hash_array        for (int i = 0; i < n; i++)            count1[str1[i] - 'a']++;        for (int i = 0; i < n; i++)            count2[str2[i] - 'a']++;         // Count number of characters that are        // different in both strings        for (int i = 0; i < MAX_CHAR; i++)            if (count1[i] > count2[i])                count = count + Math.Abs(count1[i] -                                         count2[i]);         // Return true if count is        // less than or equal to k        return (count <= k);    }     // Driver code    public static void Main()    {        string str1 = "anagram";        string str2 = "grammar";        int k = 2;        if (arekAnagrams(str1, str2, k))            Console.Write("Yes");        else            Console.Write("No");    }}// This code is contributed by nitin mittal.
<?php// PHP program to check// if two strings are// k anagram or not.$MAX_CHAR = 26; // Function to check that// string is k-anagram or notfunction arekAnagrams($str1, $str2, $k){    global $MAX_CHAR;    // If both strings are not of    // equal length then return false    $n = strlen($str1);    if (strlen($str2) != $n)        return false;     $count1 = (0);    $count2 = (0);     // Store the occurrence of all    // characters in a hash_array    $count = 0;     // Count number of characters that    // are different in both strings    for ($i = 0; $i < $MAX_CHAR; $i++)        if ($count1[$i] > $count2[$i])            $count = $count + abs($count1[$i] -                                  $count2[$i]);     // Return true if count is    // less than or equal to k    return ($count <= $k);} // Driver Code$str1 = "anagram";$str2 = "grammar";$k = 2;if (arekAnagrams($str1, $str2, $k))    echo "Yes";else    echo "No"; // This code is contributed by m_kit?>
<script> // Javascript program to check if two// strings are k anagram or not.let MAX_CHAR = 26; // Function to check that string is// k-anagram or not   function arekAnagrams(str1, str2, k){         // If both strings are not of equal    // length then return false    let n = str1.length;    if (str2.length != n)        return false;     let count1 = new Array(MAX_CHAR);    let count2 = new Array(MAX_CHAR);    let count = 0;         // Store the occurrence of all characters    // in a hash_array    for(let i = 0; i < n; i++)        count1[str1[i].charCodeAt(0) -                   'a'.charCodeAt(0)]++;    for(let i = 0; i < n; i++)        count2[str2[i].charCodeAt(0) -                   'a'.charCodeAt(0)]++;     // Count number of characters that are    // different in both strings    for(let i = 0; i < MAX_CHAR; i++)        if (count1[i] > count2[i])            count = count + Math.abs(count1[i] -                                     count2[i]);     // Return true if count is less than or    // equal to k    return (count <= k);} // Driver codelet str1 = "anagram";let str2 = "grammar";let k = 2; if (arekAnagrams(str1, str2, k))    document.write("Yes");else    document.write("No"); // This code is contributed by rag2127 </script>
Output :  
Yes
Method 2: We can optimize above solution. Here we use only one count array to store counts of characters in str1. We traverse str2 and decrement occurrence of every character in count array that is present in str2. If we find a character that is not there in str1, we increment count of different characters. If count of different character become more than k, we return false.
C++
Java
Python3
C#
PHP
Javascript
// Optimized C++ program to check if two strings// are k anagram or not.#include<bits/stdc++.h>using namespace std; const int MAX_CHAR = 26; // Function to check if str1 and str2 are k-anagram// or notbool areKAnagrams(string str1, string str2, int k){    // If both strings are not of equal    // length then return false    int n = str1.length();    if (str2.length() != n)        return false;     int hash_str1[MAX_CHAR] = {0};     // Store the occurrence of all characters    // in a hash_array    for (int i = 0; i < n ; i++)        hash_str1[str1[i]-'a']++;     // Store the occurrence of all characters    // in a hash_array    int count = 0;    for (int i = 0; i < n ; i++)    {        if (hash_str1[str2[i]-'a'] > 0)            hash_str1[str2[i]-'a']--;        else            count++;         if (count > k)            return false;    }     // Return true if count is less than or    // equal to k    return true;} // Driver codeint main(){    string str1 = "fodr";    string str2 = "gork";    int k = 2;    if (areKAnagrams(str1, str2, k) == true)        cout << "Yes";    else        cout << "No";    return 0;}
// Optimized Java program to check if two strings// are k anagram or not.public class GFG {         static final int MAX_CHAR = 26;          // Function to check if str1 and str2 are k-anagram    // or not    static boolean areKAnagrams(String str1, String str2,                                                  int k)    {        // If both strings are not of equal        // length then return false        int n = str1.length();        if (str2.length() != n)            return false;              int[] hash_str1 = new int[MAX_CHAR];              // Store the occurrence of all characters        // in a hash_array        for (int i = 0; i < n ; i++)            hash_str1[str1.charAt(i)-'a']++;              // Store the occurrence of all characters        // in a hash_array        int count = 0;        for (int i = 0; i < n ; i++)        {            if (hash_str1[str2.charAt(i)-'a'] > 0)                hash_str1[str2.charAt(i)-'a']--;            else                count++;                  if (count > k)                return false;        }              // Return true if count is less than or        // equal to k        return true;    }          // Driver code    public static void main(String args[])    {        String str1 = "fodr";        String str2 = "gork";        int k = 2;        if (areKAnagrams(str1, str2, k) == true)            System.out.println("Yes");        else            System.out.println("No");    }}// This code is contributed by Sumit Ghosh
# Optimized Python3 program# to check if two strings# are k anagram or not.MAX_CHAR = 26; # Function to check if str1# and str2 are k-anagram or notdef areKAnagrams(str1, str2, k):    # If both strings are    # not of equal length    # then return false     n = len(str1);    if (len(str2) != n):        return False;     hash_str1 = [0]*(MAX_CHAR);     # Store the occurrence of    # all characters in a hash_array    for i in range(n):        hash_str1[ord(str1[i]) - ord('a')]+=1;     # Store the occurrence of all    # characters in a hash_array    count = 0;    for i in range(n):        if (hash_str1[ord(str2[i]) - ord('a')] > 0):            hash_str1[ord(str2[i]) - ord('a')]-=1;        else:            count+=1;         if (count > k):            return False;     # Return true if count is    # less than or equal to k    return True; # Driver codestr1 = "fodr";str2 = "gork";k = 2;if (areKAnagrams(str1, str2, k) == True):    print("Yes");else:    print("No");         # This code is contributed by mits
// Optimized C# program to check if two strings// are k anagram or not.using System;  class GFG {         static  int MAX_CHAR = 26;         // Function to check if str1 and str2 are k-anagram    // or not    static bool areKAnagrams(String str1, String str2,                                                int k)    {        // If both strings are not of equal        // [i] then return false        int n = str1.Length;        if (str2.Length != n)            return false;             int[] hash_str1 = new int[MAX_CHAR];             // Store the occurrence of all characters        // in a hash_array        for (int i = 0; i < n ; i++)            hash_str1[str1[i]-'a']++;             // Store the occurrence of all characters        // in a hash_array        int count = 0;        for (int i = 0; i < n ; i++)        {            if (hash_str1[str2[i]-'a'] > 0)                hash_str1[str2[i]-'a']--;            else                count++;                 if (count > k)                return false;        }             // Return true if count is less than or        // equal to k        return true;    }         // Driver code     static void Main()    {        String str1 = "fodr";        String str2 = "gork";        int k = 2;         if (areKAnagrams(str1, str2, k) == true)            Console.Write("Yes");        else            Console.Write("No");    }}// This code is contributed by Anuj_67
<?php// Optimized PHP program// to check if two strings// are k anagram or not.$MAX_CHAR = 26; // Function to check if str1// and str2 are k-anagram or notfunction areKAnagrams($str1,                      $str2, $k){    global $MAX_CHAR;    // If both strings are    // not of equal length    // then return false     $n = strlen($str1);    if (strlen($str2) != $n)        return false;     $hash_str1 = array(0);     // Store the occurrence of    // all characters in a hash_array    for ($i = 0; $i < $n ; $i++)        $hash_str1[$str1[$i] - 'a']++;     // Store the occurrence of all    // characters in a hash_array    $count = 0;    for ($i = 0; $i < $n ; $i++)    {        if ($hash_str1[$str2[$i] - 'a'] > 0)            $hash_str1[$str2[$i] - 'a']--;        else            $count++;         if ($count > $k)            return false;    }     // Return true if count is    // less than or equal to k    return true;} // Driver code$str1 = "fodr";$str2 = "gork";$k = 2;if (areKAnagrams($str1, $str2, $k) == true)    echo "Yes";else    echo "No";         // This code is contributed by ajit?>
<script>     // Optimized Javascript program    // to check if two strings    // are k anagram or not.         let MAX_CHAR = 26;          // Function to check if str1 and    // str2 are k-anagram    // or not    function areKAnagrams(str1, str2, k)    {        // If both strings are not of equal        // [i] then return false        let n = str1.length;        if (str2.length != n)            return false;              let hash_str1 = Array(MAX_CHAR);        hash_str1.fill(0);              // Store the occurrence of all characters        // in a hash_array        for (let i = 0; i < n ; i++)            hash_str1[str1[i].charCodeAt()-            'a'.charCodeAt()]++;              // Store the occurrence of all characters        // in a hash_array        let count = 0;        for (let i = 0; i < n ; i++)        {            if (hash_str1[str2[i].charCodeAt()-            'a'.charCodeAt()] > 0)                hash_str1[str2[i].charCodeAt()-                'a'.charCodeAt()]--;            else                count++;                  if (count > k)                return false;        }              // Return true if count is less than or        // equal to k        return true;    }         let str1 = "fodr";    let str2 = "gork";    let k = 2;     if (areKAnagrams(str1, str2, k) == true)      document.write("Yes");    else      document.write("No");     </script>
Output: 
Yes
Method 3:  
In this method the idea is to initialize an array or a list and the base case would be to check the strings and if they have different lengths then they cannot form an anagram.
Otherwise convert the strings into character array and sort them.
Then iterate till the length of the string and if the character are not equal then add it to the list and check if list size is less than equal to K then it is possible to form K anagram else not.
Below is the implementation of the above approach: 
C++
Java
Python3
C#
Javascript
// CPP program for the above approach#include <bits/stdc++.h>using namespace std; // Function to check k// anagram of two stringsbool kAnagrams(string str1, string str2, int k){    int flag = 0;     // First Condition: If both the    // strings have different length ,    // then they cannot form anagram    if (str1.length() != str2.length())        return false;    int n = str1.length();    // Converting str1 to Character Array arr1    char arr1[n];     // Converting str2 to Character Array arr2    char arr2[n];     strcpy(arr1, str1.c_str());    strcpy(arr2, str2.c_str());    // Sort arr1 in increasing order    sort(arr1, arr1 + n);     // Sort arr2 in increasing order    sort(arr2, arr2 + n);     vector<char> list;       // Iterate till str1.length()    for (int i = 0; i < str1.length(); i++) {         // Condition if arr1[i] is        // not equal to arr2[i]        // then add it to list        if (arr1[i] != arr2[i]) {            list.push_back(arr2[i]);        }    }     // Condition to check if    // strings for K-anagram or not    if (list.size() <= k)        flag = 1;     if (flag == 1)        return true;    else        return false;} // Driver Codeint main(){     string str1 = "anagram", str2 = "grammar";    int k = 3;     // Function Call    kAnagrams(str1, str2, k);    if (kAnagrams(str1, str2, k) == true)        cout << "Yes";    else        cout << "No";     // This code is contributed by bolliranadheer}
// Java program for the above approachimport java.util.*;class GFG{     // Function to check k// anagram of two stringspublic static boolean kAnagrams(String str1,                                String str2, int k){    int flag = 0;         List<Character> list = new ArrayList<>();         // First Condition: If both the    // strings have different length ,    // then they cannot form anagram    if (str1.length() != str2.length())        System.exit(0);         // Converting str1 to Character Array arr1    char arr1[] = str1.toCharArray();         // Converting str2 to Character Array arr2    char arr2[] = str2.toCharArray();         // Sort arr1 in increasing order    Arrays.sort(arr1);         // Sort arr2 in increasing order    Arrays.sort(arr2);         // Iterate till str1.length()    for (int i = 0; i < str1.length(); i++)    {                 // Condition if arr1[i] is        // not equal to arr2[i]        // then add it to list        if (arr1[i] != arr2[i])        {            list.add(arr2[i]);        }    }         // Condition to check if    // strings for K-anagram or not    if (list.size() <= k)        flag = 1;     if (flag == 1)        return true;    else        return false;} // Driver Codepublic static void main(String[] args){     String str1 = "fodr";    String str2 = "gork";    int k = 2;         // Function Call    kAnagrams(str1, str2, k);    if (kAnagrams(str1, str2, k) == true)        System.out.println("Yes");    else        System.out.println("No");}}
# Python 3 program for the above approachimport sys # Function to check k# anagram of two strings  def kAnagrams(str1, str2, k):     flag = 0     list1 = []     # First Condition: If both the    # strings have different length ,    # then they cannot form anagram    if (len(str1) != len(str2)):        sys.exit()     # Converting str1 to Character Array arr1    arr1 = list(str1)     # Converting str2 to Character Array arr2    arr2 = list(str2)     # Sort arr1 in increasing order    arr1.sort()     # Sort arr2 in increasing order    arr2.sort()     # Iterate till str1.length()    for i in range(len(str1)):         # Condition if arr1[i] is        # not equal to arr2[i]        # then add it to list        if (arr1[i] != arr2[i]):            list1.append(arr2[i])     # Condition to check if    # strings for K-anagram or not    if (len(list1) <= k):        flag = 1     if (flag == 1):        return True    else:        return False  # Driver Codeif __name__ == "__main__":     str1 = "fodr"    str2 = "gork"    k = 2     # Function Call    kAnagrams(str1, str2, k)    if (kAnagrams(str1, str2, k) == True):        print("Yes")    else:        print("No")
// C# program for the above approachusing System;using System.Collections.Generic; public class GFG{   // Function to check k  // anagram of two strings  public static bool kAnagrams(string str1, string str2, int k)  {    int flag = 0;     List<char> list = new List<char>();     // First Condition: If both the    // strings have different length ,    // then they cannot form anagram    if (str1.Length != str2.Length)    {      return false;    }     // Converting str1 to Character Array arr1    char[] arr1 = str1.ToCharArray();     // Converting str2 to Character Array arr2    char[] arr2 = str2.ToCharArray();     // Sort arr1 in increasing order    Array.Sort(arr1);     // Sort arr2 in increasing order    Array.Sort(arr2);     // Iterate till str1.length()    for (int i = 0; i < str1.Length; i++)    {       // Condition if arr1[i] is      // not equal to arr2[i]      // then add it to list      if (arr1[i] != arr2[i])      {        list.Add(arr2[i]);      }    }     // Condition to check if    // strings for K-anagram or not    if (list.Count <= k)      flag = 1;     if (flag == 1)      return true;    else      return false;  }   // Driver Code  static public void Main ()  {    string str1 = "fodr";    string str2 = "gork";    int k = 2;     // Function Call    kAnagrams(str1, str2, k);    if (kAnagrams(str1, str2, k) == true)      Console.WriteLine("Yes");    else      Console.WriteLine("No");  }} // This code is contributed by avanitrachhadiya2155
<script> // Javascript program for the above approach // Function to check k// anagram of two stringsfunction kAnagrams(str1, str2, k){    let flag = 0;    let list = [];         // First Condition: If both the    // strings have different length ,    // then they cannot form anagram    if (str1.length != str2.length)    {        return false;    }         // Converting str1 to Character Array arr1    let arr1 = str1.split('');         // Converting str2 to Character Array arr2    let arr2 = str2.split('');         // Sort arr1 in increasing order    arr1.sort();         // Sort arr2 in increasing order    arr2.sort();         // Iterate till str1.length()    for(let i = 0; i < str1.length; i++)    {                 // Condition if arr1[i] is        // not equal to arr2[i]        // then add it to list        if (arr1[i] != arr2[i])        {            list.push(arr2[i]);        }    }         // Condition to check if    // strings for K-anagram or not    if (list.length <= k)        flag = 1;         if (flag == 1)        return true;    else        return false;} // Driver codelet str1 = "fodr";let str2 = "gork";let k = 2; // Function CallkAnagrams(str1, str2, k);if (kAnagrams(str1, str2, k) == true)    document.write("Yes");else    document.write("No");     // This code is contributed by suresh07 </script>
Output: 
Yes
-w  This article is contributed by Sahil Chhabra (akku). If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above. 
nitin mittal
vt_m
jit_t
SHUBHAMSINGH10
Mithun Kumar
DebdyutiDas
ukasp
bolliranadheer
avanitrachhadiya2155
rag2127
divyeshrabadiya07
suresh07
adnanirshad158
anagram
Hash
Strings
Hash
Strings
anagram
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Quadratic Probing in Hashing
Rearrange an array such that arr[i] = i
What are Hash Functions and How to choose a good Hash Function?
Hashing in Java
Index Mapping (or Trivial Hashing) with negatives allowed
Write a program to reverse an array or string
Reverse a string in Java
Write a program to print all permutations of a given string
C++ Data Types
Longest Common Subsequence | DP-4