Related Articles

Related Articles

Check if two strings are k-anagrams or not
  • Difficulty Level : Easy
  • Last Updated : 06 Nov, 2020

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. 
 

  1. Both have same number of characters.
  2. 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.
 

  1. Stores occurrence of all characters of both strings in separate count arrays.
  2. Count number of different characters in both strings (in this if a strings has 4 a and second has 3 ‘a’ then it will be also count.
  3. If count of different characters is less than or equal to k, then return true else false.

 



C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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 not
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[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 code
int main()
{
    string str1 = "anagram";
    string str2 = "grammar";
    int k = 2;
    if (arekAnagrams(str1, str2, k))
        cout << "Yes";
    else
        cout<< "No";
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 program to check if two 
# strings are k anagram or not.
MAX_CHAR = 26
  
# Function to check that is 
# k-anagram or not 
def 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 Code 
if __name__ == '__main__':
    str1 = "anagram"
    str2 = "grammar"
    k = 2
    if (arekAnagrams(str1, str2, k)): 
        print("Yes"
    else:
        print("No")
  
# This code is contributed
# by SHUBHAMSINGH10

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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.

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?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 not
function 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
?>

chevron_right


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++

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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 not
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 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 code
int main()
{
    string str1 = "fodr";
    string str2 = "gork";
    int k = 2;
    if (areKAnagrams(str1, str2, k) == true)
        cout << "Yes";
    else
        cout << "No";
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# 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 not
def 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 code
str1 = "fodr";
str2 = "gork";
k = 2;
if (areKAnagrams(str1, str2, k) == True):
    print("Yes");
else:
    print("No");
          
# This code is contributed by mits

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?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 not
function 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
?>

chevron_right


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:
 

Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program for the above approach
import java.util.*;
class GFG{
      
// Function to check k 
// anagram of two strings
public 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);
      
    // Coverting str1 to Character Array arr1
    char arr1[] = str1.toCharArray();
      
    // Coverting 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 Code
public 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");
}
}

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python 3 program for the above approach
import 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()
  
    # Coverting str1 to Character Array arr1
    arr1 = list(str1)
  
    # Coverting 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 Code
if __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")

chevron_right


Output: 
 

Yes


This article is contributed by Sahil Chhabra (akku). If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@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.
 

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.




My Personal Notes arrow_drop_up
Recommended Articles
Page :