📌  相关文章
📜  检查两个字符串是否是彼此的字谜

📅  最后修改于: 2022-05-13 01:57:07.945000             🧑  作者: Mango

检查两个字符串是否是彼此的字谜

编写一个函数来检查两个给定的字符串是否是彼此的字谜。一个字符串的变位词是另一个包含相同字符的字符串,只是字符的顺序可以不同。例如,“abcd”和“dabc”是彼此的字谜。

检查两个字符串是否是彼此的字谜

我们强烈建议您单击此处并进行练习,然后再继续使用解决方案。

方法一(使用排序)

  1. 对两个字符串进行排序
  2. 比较排序后的字符串

下面是上述思想的实现:

C++
// C++ program to check whether two strings are anagrams
// of each other
#include 
using namespace std;
 
/* function to check whether two strings are anagram of
each other */
bool areAnagram(string str1, string str2)
{
    // Get lengths of both strings
    int n1 = str1.length();
    int n2 = str2.length();
 
    // If length of both strings is not same, then they
    // cannot be anagram
    if (n1 != n2)
        return false;
 
    // Sort both the strings
    sort(str1.begin(), str1.end());
    sort(str2.begin(), str2.end());
 
    // Compare sorted strings
    for (int i = 0; i < n1; i++)
        if (str1[i] != str2[i])
            return false;
 
    return true;
}
 
// Driver code
int main()
{
    string str1 = "test";
    string str2 = "ttew";
 
    // Function Call
    if (areAnagram(str1, str2))
        cout << "The two strings are anagram of each other";
    else
        cout << "The two strings are not anagram of each "
                "other";
 
    return 0;
}


Java
// JAVA program to check whether two strings
// are anagrams of each other
import java.io.*;
import java.util.Arrays;
import java.util.Collections;
 
class GFG {
 
    /* function to check whether two strings are
    anagram of each other */
    static boolean areAnagram(char[] str1, char[] str2)
    {
        // Get lengths of both strings
        int n1 = str1.length;
        int n2 = str2.length;
 
        // If length of both strings is not same,
        // then they cannot be anagram
        if (n1 != n2)
            return false;
 
        // Sort both strings
        Arrays.sort(str1);
        Arrays.sort(str2);
 
        // Compare sorted strings
        for (int i = 0; i < n1; i++)
            if (str1[i] != str2[i])
                return false;
 
        return true;
    }
 
    /* Driver Code*/
    public static void main(String args[])
    {
        char str1[] = { 't', 'e', 's', 't' };
        char str2[] = { 't', 't', 'e', 'w' };
       
        // Function Call
        if (areAnagram(str1, str2))
            System.out.println("The two strings are"
                               + " anagram of each other");
        else
            System.out.println("The two strings are not"
                               + " anagram of each other");
    }
}
 
// This code is contributed by Nikita Tiwari.


Python
class Solution:
 
    # Function is to check whether two strings are anagram of each other or not.
    def isAnagram(self, a, b):
 
        if sorted(a) == sorted(b):
            return True
        else:
            return False
 
# {
#  Driver Code Starts
 
if __name__ == '__main__':
    t = int(input())
    for i in range(t):
        a, b = map(str, input().strip().split())
        if(Solution().isAnagram(a, b)):
            print("The two strings are anagram of each other")
        else:
            print("The two strings are not anagram of each other")
# } Driver Code Ends


C#
// C# program to check whether two
// strings are anagrams of each other
using System;
using System.Collections;
class GFG {
 
    /* function to check whether two
strings are anagram of each other */
    public static bool areAnagram(ArrayList str1,
                                  ArrayList str2)
    {
        // Get lengths of both strings
        int n1 = str1.Count;
        int n2 = str2.Count;
 
        // If length of both strings is not
        // same, then they cannot be anagram
        if (n1 != n2) {
            return false;
        }
 
        // Sort both strings
        str1.Sort();
        str2.Sort();
 
        // Compare sorted strings
        for (int i = 0; i < n1; i++) {
            if (str1[i] != str2[i]) {
                return false;
            }
        }
 
        return true;
    }
 
    // Driver Code
    public static void Main(string[] args)
    {
        // create and initialize new ArrayList
        ArrayList str1 = new ArrayList();
        str1.Add('t');
        str1.Add('e');
        str1.Add('s');
        str1.Add('t');
        // create and initialize new ArrayList
        ArrayList str2 = new ArrayList();
        str2.Add('t');
        str2.Add('t');
        str2.Add('e');
        str2.Add('w');
 
        // Function call
        if (areAnagram(str1, str2)) {
            Console.WriteLine("The two strings are"
                              + " anagram of each other");
        }
        else {
            Console.WriteLine("The two strings are not"
                              + " anagram of each other");
        }
    }
}
 
// This code is contributed by Shrikant13


Javascript


C++
// C++ program to check if two strings
// are anagrams of each other
#include 
using namespace std;
#define NO_OF_CHARS 256
 
/* function to check whether two strings are anagram of
each other */
bool areAnagram(char* str1, char* str2)
{
    // Create 2 count arrays and initialize all values as 0
    int count1[NO_OF_CHARS] = { 0 };
    int count2[NO_OF_CHARS] = { 0 };
    int i;
 
    // For each character in input strings, increment count
    // in the corresponding count array
    for (i = 0; str1[i] && str2[i]; i++) {
        count1[str1[i]]++;
        count2[str2[i]]++;
    }
 
    // If both strings are of different length. Removing
    // this condition will make the program fail for strings
    // like "aaca" and "aca"
    if (str1[i] || str2[i])
        return false;
 
    // Compare count arrays
    for (i = 0; i < NO_OF_CHARS; i++)
        if (count1[i] != count2[i])
            return false;
 
    return true;
}
 
/* Driver code*/
int main()
{
    char str1[] = "geeksforgeeks";
    char str2[] = "forgeeksgeeks";
   
    // Function Call
    if (areAnagram(str1, str2))
        cout << "The two strings are anagram of each other";
    else
        cout << "The two strings are not anagram of each "
                "other";
 
    return 0;
}
 
// This is code is contributed by rathbhupendra


C
// C program to check if two strings
// are anagrams of each other
#include 
#define NO_OF_CHARS 256
 
/* function to check whether two strings are anagram of
   each other */
bool areAnagram(char* str1, char* str2)
{
    // Create 2 count arrays and initialize all values as 0
    int count1[NO_OF_CHARS] = { 0 };
    int count2[NO_OF_CHARS] = { 0 };
    int i;
 
    // For each character in input strings, increment count
    // in the corresponding count array
    for (i = 0; str1[i] && str2[i]; i++) {
        count1[str1[i]]++;
        count2[str2[i]]++;
    }
 
    // If both strings are of different length. Removing
    // this condition will make the program fail for strings
    // like "aaca" and "aca"
    if (str1[i] || str2[i])
        return false;
 
    // Compare count arrays
    for (i = 0; i < NO_OF_CHARS; i++)
        if (count1[i] != count2[i])
            return false;
 
    return true;
}
 
/* Driver code*/
int main()
{
    char str1[] = "geeksforgeeks";
    char str2[] = "forgeeksgeeks";
   
    // Function Call
    if (areAnagram(str1, str2))
        printf("The two strings are anagram of each other");
    else
        printf("The two strings are not anagram of each "
               "other");
 
    return 0;
}


Java
// JAVA program to check if two strings
// are anagrams of each other
import java.io.*;
import java.util.*;
 
class GFG {
 
    static int NO_OF_CHARS = 256;
 
    /* function to check whether two strings
    are anagram of each other */
    static boolean areAnagram(char str1[], char str2[])
    {
        // Create 2 count arrays and initialize
        // all values as 0
        int count1[] = new int[NO_OF_CHARS];
        Arrays.fill(count1, 0);
        int count2[] = new int[NO_OF_CHARS];
        Arrays.fill(count2, 0);
        int i;
 
        // For each character in input strings,
        // increment count in the corresponding
        // count array
        for (i = 0; i < str1.length && i < str2.length;
             i++) {
            count1[str1[i]]++;
            count2[str2[i]]++;
        }
 
        // If both strings are of different length.
        // Removing this condition will make the program
        // fail for strings like "aaca" and "aca"
        if (str1.length != str2.length)
            return false;
 
        // Compare count arrays
        for (i = 0; i < NO_OF_CHARS; i++)
            if (count1[i] != count2[i])
                return false;
 
        return true;
    }
 
    /* Driver code*/
    public static void main(String args[])
    {
        char str1[] = ("geeksforgeeks").toCharArray();
        char str2[] = ("forgeeksgeeks").toCharArray();
 
        // Function call
        if (areAnagram(str1, str2))
            System.out.println("The two strings are"
                               + "anagram of each other");
        else
            System.out.println("The two strings are not"
                               + " anagram of each other");
    }
}
 
// This code is contributed by Nikita Tiwari.


Python
# Python program to check if two strings are anagrams of
# each other
NO_OF_CHARS = 256
 
# Function to check whether two strings are anagram of
# each other
 
 
def areAnagram(str1, str2):
 
    # Create two count arrays and initialize all values as 0
    count1 = [0] * NO_OF_CHARS
    count2 = [0] * NO_OF_CHARS
 
    # For each character in input strings, increment count
    # in the corresponding count array
    for i in str1:
        count1[ord(i)] += 1
 
    for i in str2:
        count2[ord(i)] += 1
 
    # If both strings are of different length. Removing this
    # condition will make the program fail for strings like
    # "aaca" and "aca"
    if len(str1) != len(str2):
        return 0
 
    # Compare count arrays
    for i in xrange(NO_OF_CHARS):
        if count1[i] != count2[i]:
            return 0
 
    return 1
 
 
# Driver code
str1 = "geeksforgeeks"
str2 = "forgeeksgeeks"
 
# Function call
if areAnagram(str1, str2):
    print "The two strings are anagram of each other"
else:
    print "The two strings are not anagram of each other"
 
# This code is contributed by Bhavya Jain


C#
// C# program to check if two strings
// are anagrams of each other
 
using System;
 
public class GFG {
 
    static int NO_OF_CHARS = 256;
 
    /* function to check whether two strings
    are anagram of each other */
    static bool areAnagram(char[] str1, char[] str2)
    {
        // Create 2 count arrays and initialize
        // all values as 0
        int[] count1 = new int[NO_OF_CHARS];
        int[] count2 = new int[NO_OF_CHARS];
        int i;
 
        // For each character in input strings,
        // increment count in the corresponding
        // count array
        for (i = 0; i < str1.Length && i < str2.Length;
             i++) {
            count1[str1[i]]++;
            count2[str2[i]]++;
        }
 
        // If both strings are of different length.
        // Removing this condition will make the program
        // fail for strings like "aaca" and "aca"
        if (str1.Length != str2.Length)
            return false;
 
        // Compare count arrays
        for (i = 0; i < NO_OF_CHARS; i++)
            if (count1[i] != count2[i])
                return false;
 
        return true;
    }
 
    /* Driver code*/
    public static void Main()
    {
        char[] str1 = ("geeksforgeeks").ToCharArray();
        char[] str2 = ("forgeeksgeeks").ToCharArray();
 
        // Function Call
        if (areAnagram(str1, str2))
            Console.WriteLine("The two strings are"
                              + "anagram of each other");
        else
            Console.WriteLine("The two strings are not"
                              + " anagram of each other");
    }
}
 
// This code contributed by 29AjayKumar


Javascript


C++
// C++ program to check if two strings
// are anagrams of each other
#include 
using namespace std;
#define NO_OF_CHARS 256
 
bool areAnagram(char* str1, char* str2)
{
    // Create a count array and initialize all values as 0
    int count[NO_OF_CHARS] = { 0 };
    int i;
 
    // For each character in input strings, increment count
    // in the corresponding count array
    for (i = 0; str1[i] && str2[i]; i++) {
        count[str1[i]]++;
        count[str2[i]]--;
    }
 
    // If both strings are of different length. Removing
    // this condition will make the program fail for strings
    // like "aaca" and "aca"
    if (str1[i] || str2[i])
        return false;
 
    // See if there is any non-zero value in count array
    for (i = 0; i < NO_OF_CHARS; i++)
        if (count[i])
            return false;
    return true;
}
 
// Driver code
int main()
{
    char str1[] = "geeksforgeeks";
    char str2[] = "forgeeksgeeks";
   
    // Function call
    if (areAnagram(str1, str2))
        cout << "The two strings are anagram of each other";
    else
        cout << "The two strings are not anagram of each "
                "other";
 
    return 0;
}


Java
// Java program to check if two strings
// are anagrams of each other
class GFG{
 
static int NO_OF_CHARS = 256;
 
// function to check if two strings
// are anagrams of each other
static boolean areAnagram(char[] str1,
                          char[] str2)
{
     
    // Create a count array and initialize
    // all values as 0
    int[] count = new int[NO_OF_CHARS];
    int i;
 
    // For each character in input strings,
    // increment count in the corresponding
    // count array
    for(i = 0; i < str1.length; i++)
    {
        count[str1[i] - 'a']++;
        count[str2[i] - 'a']--;
    }
 
    // If both strings are of different
    // length. Removing this condition
    // will make the program fail for
    // strings like "aaca" and "aca"
    if (str1.length != str2.length)
        return false;
 
    // See if there is any non-zero
    // value in count array
    for(i = 0; i < NO_OF_CHARS; i++)
        if (count[i] != 0)
        {
            return false;
        }
    return true;
}
 
// Driver code
public static void main(String[] args)
{
    char str1[] = "geeksforgeeks".toCharArray();
    char str2[] = "forgeeksgeeks".toCharArray();
 
    // Function call
    if (areAnagram(str1, str2))
        System.out.print("The two strings are " +
                         "anagram of each other");
    else
        System.out.print("The two strings are " +
                         "not anagram of each other");
}
}
 
// This code is contributed by mark_85


Python3
# Python program to check if two strings
# are anagrams of each other
 
NO_OF_CHARS = 256
 
# function to check if two strings
# are anagrams of each other
def areAnagram(str1,str2):
     
    # Create a count array and initialize
    # all values as 0
    count=[0 for i in range(NO_OF_CHARS)]
    i=0
     
    # For each character in input strings,
    # increment count in the corresponding
    # count array
    for i in range(len(str1)):
        count[ord(str1[i]) - ord('a')] += 1;
        count[ord(str2[i]) - ord('a')] -= 1;
     
    # If both strings are of different
    # length. Removing this condition
    # will make the program fail for
    # strings like "aaca" and "aca"   
    if(len(str1) != len(str2)):
        return False;
     
    # See if there is any non-zero
    # value in count array
    for i in range(NO_OF_CHARS):
        if (count[i] != 0):
            return False
         
     
    return True
 
# Driver code
str1="geeksforgeeks"
str2="forgeeksgeeks"
 
# Function call
if (areAnagram(str1, str2)):
    print("The two strings are anagram of each other")
else:
    print("The two strings are not anagram of each other")
     
     
# This code is contributed by patel2127


C#
// C# program to check if two strings
// are anagrams of each other
using System;
 
class GFG{
 
static int NO_OF_CHARS = 256;
 
// function to check if two strings
// are anagrams of each other
static bool areAnagram(char[] str1,
                       char[] str2)
{
     
    // Create a count array and initialize
    // all values as 0
    int[] count = new int[NO_OF_CHARS];
    int i;
 
    // For each character in input strings,
    // increment count in the corresponding
    // count array
    for(i = 0; i < str1.Length; i++)
    {
        count[str1[i] - 'a']++;
        count[str2[i] - 'a']--;
    }
 
    // If both strings are of different
    // Length. Removing this condition
    // will make the program fail for
    // strings like "aaca" and "aca"
    if (str1.Length != str2.Length)
        return false;
 
    // See if there is any non-zero
    // value in count array
    for(i = 0; i < NO_OF_CHARS; i++)
        if (count[i] != 0)
        {
            return false;
        }
         
    return true;
}
 
// Driver code
public static void Main(String []args)
{
    char []str1 = "geeksforgeeks".ToCharArray();
    char []str2 = "forgeeksgeeks".ToCharArray();
 
    // Function call
    if (areAnagram(str1, str2))
       Console.Write("The two strings are " +
                     "anagram of each other");
    else
       Console.Write("The two strings are " +
                     "not anagram of each other");
}
}
 
// This code is contributed by shivanisinghss2110


Javascript


Java
import java.io.*;
import java.util.*;
 
class GFG {
    public static boolean isAnagram(String a, String b)
    {
        // Check if length of both strings is same or not
        if (a.length() != b.length()) {
            return false;
        }
        // Create a HashMap containing Character as Key and
        // Integer as Value. We will be storing character as
        // Key and count of character as Value.
        HashMap map = new HashMap<>();
        // Loop over all character of String a and put in
        // HashMap.
        for (int i = 0; i < a.length(); i++) {
            // Check if HashMap already contain current
            // character or not
            if (map.containsKey(a.charAt(i))) {
                // If contains increase count by 1 for that
                // character
                map.put(a.charAt(i),
                        map.get(a.charAt(i)) + 1);
            }
            else {
                // else put that character in map and set
                // count to 1 as character is encountered
                // first time
                map.put(a.charAt(i), 1);
            }
        }
        // Now loop over String b
        for (int i = 0; i < b.length(); i++) {
            // Check if current character already exists in
            // HashMap/map
            if (map.containsKey(b.charAt(i))) {
                // If contains reduce count of that
                // character by 1 to indicate that current
                // character has been already counted as
                // idea here is to check if in last count of
                // all characters in last is zero which
                // means all characters in String a are
                // present in String b.
                map.put(b.charAt(i),
                        map.get(b.charAt(i)) - 1);
            }
        }
        // Extract all keys of HashMap/map
        Set keys = map.keySet();
        // Loop over all keys and check if all keys are 0.
        // If so it means it is anagram.
        for (Character key : keys) {
            if (map.get(key) != 0) {
                return false;
            }
        }
        // Returning True as all keys are zero
        return true;
    }
    public static void main(String[] args)
    {
        String str1 = "geeksforgeeks";
        String str2 = "forgeeksgeeks";
 
        // Function call
        if (isAnagram(str1, str2))
            System.out.print("The two strings are "
                             + "anagram of each other");
        else
            System.out.print("The two strings are "
                             + "not anagram of each other");
    }
}


C#
using System;
using System.Collections.Generic;
 
public class GFG {
  public static bool isAnagram(String a, String b)
  {
 
    // Check if length of both strings is same or not
    if (a.Length != b.Length) {
      return false;
    }
 
    // Create a Dictionary containing char as Key and
    // int as Value. We will be storing character as
    // Key and count of character as Value.
    Dictionary map = new Dictionary();
 
    // Loop over all character of String a and put in
    // Dictionary.
    for (int i = 0; i < a.Length; i++)
    {
 
      // Check if Dictionary already contain current
      // character or not
      if (map.ContainsKey(a[i]))
      {
 
        // If contains increase count by 1 for that
        // character
        map[a[i]] =
          map[a[i]] + 1;
      }
      else
      {
 
        // else put that character in map and set
        // count to 1 as character is encountered
        // first time
        map.Add(a[i], 1);
      }
    }
 
    // Now loop over String b
    for (int i = 0; i < b.Length; i++)
    {
 
      // Check if current character already exists in
      // Dictionary/map
      if (map.ContainsKey(b[i]))
      {
 
        // If contains reduce count of that
        // character by 1 to indicate that current
        // character has been already counted as
        // idea here is to check if in last count of
        // all characters in last is zero which
        // means all characters in String a are
        // present in String b.
        map[b[i]]=
          map[b[i]] - 1;
      }
    }
 
    // Extract all keys of Dictionary/map
    var keys = map.Keys;
 
    // Loop over all keys and check if all keys are 0.
    // If so it means it is anagram.
    foreach (char key in keys) {
      if (map[key] != 0) {
        return false;
      }
    }
 
    // Returning True as all keys are zero
    return true;
  }
 
  // Driver code
  public static void Main(String[] args)
  {
    String str1 = "geeksforgeeks";
    String str2 = "forgeeksgeeks";
 
    // Function call
    if (isAnagram(str1, str2))
      Console.Write("The two strings are "
                    + "anagram of each other");
    else
      Console.Write("The two strings are "
                    + "not anagram of each other");
  }
}
 
// This code is contributed by shikhasingrajput


输出:
The two strings are not anagram of each other

时间复杂度: O(nLogn)

方法2(计数字符)
此方法假定两个字符串中可能的字符集都很小。在下面的实现中,假设字符使用 8 位存储,可能有 256 个字符。

  1. 为两个字符串创建大小为 256 的计数数组。将计数数组中的所有值初始化为 0。
  2. 遍历两个字符串的每个字符并增加相应计数数组中的字符计数。
  3. 比较计数数组。如果两个计数数组相同,则返回 true。

下面是上述思想的实现:

C++

// C++ program to check if two strings
// are anagrams of each other
#include 
using namespace std;
#define NO_OF_CHARS 256
 
/* function to check whether two strings are anagram of
each other */
bool areAnagram(char* str1, char* str2)
{
    // Create 2 count arrays and initialize all values as 0
    int count1[NO_OF_CHARS] = { 0 };
    int count2[NO_OF_CHARS] = { 0 };
    int i;
 
    // For each character in input strings, increment count
    // in the corresponding count array
    for (i = 0; str1[i] && str2[i]; i++) {
        count1[str1[i]]++;
        count2[str2[i]]++;
    }
 
    // If both strings are of different length. Removing
    // this condition will make the program fail for strings
    // like "aaca" and "aca"
    if (str1[i] || str2[i])
        return false;
 
    // Compare count arrays
    for (i = 0; i < NO_OF_CHARS; i++)
        if (count1[i] != count2[i])
            return false;
 
    return true;
}
 
/* Driver code*/
int main()
{
    char str1[] = "geeksforgeeks";
    char str2[] = "forgeeksgeeks";
   
    // Function Call
    if (areAnagram(str1, str2))
        cout << "The two strings are anagram of each other";
    else
        cout << "The two strings are not anagram of each "
                "other";
 
    return 0;
}
 
// This is code is contributed by rathbhupendra

C

// C program to check if two strings
// are anagrams of each other
#include 
#define NO_OF_CHARS 256
 
/* function to check whether two strings are anagram of
   each other */
bool areAnagram(char* str1, char* str2)
{
    // Create 2 count arrays and initialize all values as 0
    int count1[NO_OF_CHARS] = { 0 };
    int count2[NO_OF_CHARS] = { 0 };
    int i;
 
    // For each character in input strings, increment count
    // in the corresponding count array
    for (i = 0; str1[i] && str2[i]; i++) {
        count1[str1[i]]++;
        count2[str2[i]]++;
    }
 
    // If both strings are of different length. Removing
    // this condition will make the program fail for strings
    // like "aaca" and "aca"
    if (str1[i] || str2[i])
        return false;
 
    // Compare count arrays
    for (i = 0; i < NO_OF_CHARS; i++)
        if (count1[i] != count2[i])
            return false;
 
    return true;
}
 
/* Driver code*/
int main()
{
    char str1[] = "geeksforgeeks";
    char str2[] = "forgeeksgeeks";
   
    // Function Call
    if (areAnagram(str1, str2))
        printf("The two strings are anagram of each other");
    else
        printf("The two strings are not anagram of each "
               "other");
 
    return 0;
}

Java

// JAVA program to check if two strings
// are anagrams of each other
import java.io.*;
import java.util.*;
 
class GFG {
 
    static int NO_OF_CHARS = 256;
 
    /* function to check whether two strings
    are anagram of each other */
    static boolean areAnagram(char str1[], char str2[])
    {
        // Create 2 count arrays and initialize
        // all values as 0
        int count1[] = new int[NO_OF_CHARS];
        Arrays.fill(count1, 0);
        int count2[] = new int[NO_OF_CHARS];
        Arrays.fill(count2, 0);
        int i;
 
        // For each character in input strings,
        // increment count in the corresponding
        // count array
        for (i = 0; i < str1.length && i < str2.length;
             i++) {
            count1[str1[i]]++;
            count2[str2[i]]++;
        }
 
        // If both strings are of different length.
        // Removing this condition will make the program
        // fail for strings like "aaca" and "aca"
        if (str1.length != str2.length)
            return false;
 
        // Compare count arrays
        for (i = 0; i < NO_OF_CHARS; i++)
            if (count1[i] != count2[i])
                return false;
 
        return true;
    }
 
    /* Driver code*/
    public static void main(String args[])
    {
        char str1[] = ("geeksforgeeks").toCharArray();
        char str2[] = ("forgeeksgeeks").toCharArray();
 
        // Function call
        if (areAnagram(str1, str2))
            System.out.println("The two strings are"
                               + "anagram of each other");
        else
            System.out.println("The two strings are not"
                               + " anagram of each other");
    }
}
 
// This code is contributed by Nikita Tiwari.

Python

# Python program to check if two strings are anagrams of
# each other
NO_OF_CHARS = 256
 
# Function to check whether two strings are anagram of
# each other
 
 
def areAnagram(str1, str2):
 
    # Create two count arrays and initialize all values as 0
    count1 = [0] * NO_OF_CHARS
    count2 = [0] * NO_OF_CHARS
 
    # For each character in input strings, increment count
    # in the corresponding count array
    for i in str1:
        count1[ord(i)] += 1
 
    for i in str2:
        count2[ord(i)] += 1
 
    # If both strings are of different length. Removing this
    # condition will make the program fail for strings like
    # "aaca" and "aca"
    if len(str1) != len(str2):
        return 0
 
    # Compare count arrays
    for i in xrange(NO_OF_CHARS):
        if count1[i] != count2[i]:
            return 0
 
    return 1
 
 
# Driver code
str1 = "geeksforgeeks"
str2 = "forgeeksgeeks"
 
# Function call
if areAnagram(str1, str2):
    print "The two strings are anagram of each other"
else:
    print "The two strings are not anagram of each other"
 
# This code is contributed by Bhavya Jain

C#

// C# program to check if two strings
// are anagrams of each other
 
using System;
 
public class GFG {
 
    static int NO_OF_CHARS = 256;
 
    /* function to check whether two strings
    are anagram of each other */
    static bool areAnagram(char[] str1, char[] str2)
    {
        // Create 2 count arrays and initialize
        // all values as 0
        int[] count1 = new int[NO_OF_CHARS];
        int[] count2 = new int[NO_OF_CHARS];
        int i;
 
        // For each character in input strings,
        // increment count in the corresponding
        // count array
        for (i = 0; i < str1.Length && i < str2.Length;
             i++) {
            count1[str1[i]]++;
            count2[str2[i]]++;
        }
 
        // If both strings are of different length.
        // Removing this condition will make the program
        // fail for strings like "aaca" and "aca"
        if (str1.Length != str2.Length)
            return false;
 
        // Compare count arrays
        for (i = 0; i < NO_OF_CHARS; i++)
            if (count1[i] != count2[i])
                return false;
 
        return true;
    }
 
    /* Driver code*/
    public static void Main()
    {
        char[] str1 = ("geeksforgeeks").ToCharArray();
        char[] str2 = ("forgeeksgeeks").ToCharArray();
 
        // Function Call
        if (areAnagram(str1, str2))
            Console.WriteLine("The two strings are"
                              + "anagram of each other");
        else
            Console.WriteLine("The two strings are not"
                              + " anagram of each other");
    }
}
 
// This code contributed by 29AjayKumar

Javascript


输出:
The two strings are anagram of each other

方法3(使用一个数组计算字符)
上述实现可以进一步只使用一个计数数组而不是两个。我们可以为 str1 中的字符递增 count 数组中的值,为 str2 中的字符递减。最后,如果所有计数值都是 0,那么这两个字符串是彼此的字谜。感谢Ace提出此优化建议。

C++

// C++ program to check if two strings
// are anagrams of each other
#include 
using namespace std;
#define NO_OF_CHARS 256
 
bool areAnagram(char* str1, char* str2)
{
    // Create a count array and initialize all values as 0
    int count[NO_OF_CHARS] = { 0 };
    int i;
 
    // For each character in input strings, increment count
    // in the corresponding count array
    for (i = 0; str1[i] && str2[i]; i++) {
        count[str1[i]]++;
        count[str2[i]]--;
    }
 
    // If both strings are of different length. Removing
    // this condition will make the program fail for strings
    // like "aaca" and "aca"
    if (str1[i] || str2[i])
        return false;
 
    // See if there is any non-zero value in count array
    for (i = 0; i < NO_OF_CHARS; i++)
        if (count[i])
            return false;
    return true;
}
 
// Driver code
int main()
{
    char str1[] = "geeksforgeeks";
    char str2[] = "forgeeksgeeks";
   
    // Function call
    if (areAnagram(str1, str2))
        cout << "The two strings are anagram of each other";
    else
        cout << "The two strings are not anagram of each "
                "other";
 
    return 0;
}

Java

// Java program to check if two strings
// are anagrams of each other
class GFG{
 
static int NO_OF_CHARS = 256;
 
// function to check if two strings
// are anagrams of each other
static boolean areAnagram(char[] str1,
                          char[] str2)
{
     
    // Create a count array and initialize
    // all values as 0
    int[] count = new int[NO_OF_CHARS];
    int i;
 
    // For each character in input strings,
    // increment count in the corresponding
    // count array
    for(i = 0; i < str1.length; i++)
    {
        count[str1[i] - 'a']++;
        count[str2[i] - 'a']--;
    }
 
    // If both strings are of different
    // length. Removing this condition
    // will make the program fail for
    // strings like "aaca" and "aca"
    if (str1.length != str2.length)
        return false;
 
    // See if there is any non-zero
    // value in count array
    for(i = 0; i < NO_OF_CHARS; i++)
        if (count[i] != 0)
        {
            return false;
        }
    return true;
}
 
// Driver code
public static void main(String[] args)
{
    char str1[] = "geeksforgeeks".toCharArray();
    char str2[] = "forgeeksgeeks".toCharArray();
 
    // Function call
    if (areAnagram(str1, str2))
        System.out.print("The two strings are " +
                         "anagram of each other");
    else
        System.out.print("The two strings are " +
                         "not anagram of each other");
}
}
 
// This code is contributed by mark_85

Python3

# Python program to check if two strings
# are anagrams of each other
 
NO_OF_CHARS = 256
 
# function to check if two strings
# are anagrams of each other
def areAnagram(str1,str2):
     
    # Create a count array and initialize
    # all values as 0
    count=[0 for i in range(NO_OF_CHARS)]
    i=0
     
    # For each character in input strings,
    # increment count in the corresponding
    # count array
    for i in range(len(str1)):
        count[ord(str1[i]) - ord('a')] += 1;
        count[ord(str2[i]) - ord('a')] -= 1;
     
    # If both strings are of different
    # length. Removing this condition
    # will make the program fail for
    # strings like "aaca" and "aca"   
    if(len(str1) != len(str2)):
        return False;
     
    # See if there is any non-zero
    # value in count array
    for i in range(NO_OF_CHARS):
        if (count[i] != 0):
            return False
         
     
    return True
 
# Driver code
str1="geeksforgeeks"
str2="forgeeksgeeks"
 
# Function call
if (areAnagram(str1, str2)):
    print("The two strings are anagram of each other")
else:
    print("The two strings are not anagram of each other")
     
     
# This code is contributed by patel2127

C#

// C# program to check if two strings
// are anagrams of each other
using System;
 
class GFG{
 
static int NO_OF_CHARS = 256;
 
// function to check if two strings
// are anagrams of each other
static bool areAnagram(char[] str1,
                       char[] str2)
{
     
    // Create a count array and initialize
    // all values as 0
    int[] count = new int[NO_OF_CHARS];
    int i;
 
    // For each character in input strings,
    // increment count in the corresponding
    // count array
    for(i = 0; i < str1.Length; i++)
    {
        count[str1[i] - 'a']++;
        count[str2[i] - 'a']--;
    }
 
    // If both strings are of different
    // Length. Removing this condition
    // will make the program fail for
    // strings like "aaca" and "aca"
    if (str1.Length != str2.Length)
        return false;
 
    // See if there is any non-zero
    // value in count array
    for(i = 0; i < NO_OF_CHARS; i++)
        if (count[i] != 0)
        {
            return false;
        }
         
    return true;
}
 
// Driver code
public static void Main(String []args)
{
    char []str1 = "geeksforgeeks".ToCharArray();
    char []str2 = "forgeeksgeeks".ToCharArray();
 
    // Function call
    if (areAnagram(str1, str2))
       Console.Write("The two strings are " +
                     "anagram of each other");
    else
       Console.Write("The two strings are " +
                     "not anagram of each other");
}
}
 
// This code is contributed by shivanisinghss2110

Javascript


输出:
The two strings are anagram of each other

时间复杂度: O(n)

方法四(将所有字符放入HashMap)

在上面的实现中,我们使用了额外的空间,因为我们正在创建 256 个字符的数组,但是我们可以使用 HashMap 对其进行优化,我们可以在 HashMap 中存储字符和字符数。想法是将一个字符串的所有字符放入 HashMap 中,并在我们在循环其他字符串时遇到它们时减少它们。

Java

import java.io.*;
import java.util.*;
 
class GFG {
    public static boolean isAnagram(String a, String b)
    {
        // Check if length of both strings is same or not
        if (a.length() != b.length()) {
            return false;
        }
        // Create a HashMap containing Character as Key and
        // Integer as Value. We will be storing character as
        // Key and count of character as Value.
        HashMap map = new HashMap<>();
        // Loop over all character of String a and put in
        // HashMap.
        for (int i = 0; i < a.length(); i++) {
            // Check if HashMap already contain current
            // character or not
            if (map.containsKey(a.charAt(i))) {
                // If contains increase count by 1 for that
                // character
                map.put(a.charAt(i),
                        map.get(a.charAt(i)) + 1);
            }
            else {
                // else put that character in map and set
                // count to 1 as character is encountered
                // first time
                map.put(a.charAt(i), 1);
            }
        }
        // Now loop over String b
        for (int i = 0; i < b.length(); i++) {
            // Check if current character already exists in
            // HashMap/map
            if (map.containsKey(b.charAt(i))) {
                // If contains reduce count of that
                // character by 1 to indicate that current
                // character has been already counted as
                // idea here is to check if in last count of
                // all characters in last is zero which
                // means all characters in String a are
                // present in String b.
                map.put(b.charAt(i),
                        map.get(b.charAt(i)) - 1);
            }
        }
        // Extract all keys of HashMap/map
        Set keys = map.keySet();
        // Loop over all keys and check if all keys are 0.
        // If so it means it is anagram.
        for (Character key : keys) {
            if (map.get(key) != 0) {
                return false;
            }
        }
        // Returning True as all keys are zero
        return true;
    }
    public static void main(String[] args)
    {
        String str1 = "geeksforgeeks";
        String str2 = "forgeeksgeeks";
 
        // Function call
        if (isAnagram(str1, str2))
            System.out.print("The two strings are "
                             + "anagram of each other");
        else
            System.out.print("The two strings are "
                             + "not anagram of each other");
    }
}

C#

using System;
using System.Collections.Generic;
 
public class GFG {
  public static bool isAnagram(String a, String b)
  {
 
    // Check if length of both strings is same or not
    if (a.Length != b.Length) {
      return false;
    }
 
    // Create a Dictionary containing char as Key and
    // int as Value. We will be storing character as
    // Key and count of character as Value.
    Dictionary map = new Dictionary();
 
    // Loop over all character of String a and put in
    // Dictionary.
    for (int i = 0; i < a.Length; i++)
    {
 
      // Check if Dictionary already contain current
      // character or not
      if (map.ContainsKey(a[i]))
      {
 
        // If contains increase count by 1 for that
        // character
        map[a[i]] =
          map[a[i]] + 1;
      }
      else
      {
 
        // else put that character in map and set
        // count to 1 as character is encountered
        // first time
        map.Add(a[i], 1);
      }
    }
 
    // Now loop over String b
    for (int i = 0; i < b.Length; i++)
    {
 
      // Check if current character already exists in
      // Dictionary/map
      if (map.ContainsKey(b[i]))
      {
 
        // If contains reduce count of that
        // character by 1 to indicate that current
        // character has been already counted as
        // idea here is to check if in last count of
        // all characters in last is zero which
        // means all characters in String a are
        // present in String b.
        map[b[i]]=
          map[b[i]] - 1;
      }
    }
 
    // Extract all keys of Dictionary/map
    var keys = map.Keys;
 
    // Loop over all keys and check if all keys are 0.
    // If so it means it is anagram.
    foreach (char key in keys) {
      if (map[key] != 0) {
        return false;
      }
    }
 
    // Returning True as all keys are zero
    return true;
  }
 
  // Driver code
  public static void Main(String[] args)
  {
    String str1 = "geeksforgeeks";
    String str2 = "forgeeksgeeks";
 
    // Function call
    if (isAnagram(str1, str2))
      Console.Write("The two strings are "
                    + "anagram of each other");
    else
      Console.Write("The two strings are "
                    + "not anagram of each other");
  }
}
 
// This code is contributed by shikhasingrajput

输出:

The two strings are anagram of each other

时间复杂度: O(n)