检查两个字符串是否是彼此的字谜
编写一个函数来检查两个给定的字符串是否是彼此的字谜。一个字符串的变位词是另一个包含相同字符的字符串,只是字符的顺序可以不同。例如,“abcd”和“dabc”是彼此的字谜。
我们强烈建议您单击此处并进行练习,然后再继续使用解决方案。
方法一(使用排序)
- 对两个字符串进行排序
- 比较排序后的字符串
下面是上述思想的实现:
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 个字符。
- 为两个字符串创建大小为 256 的计数数组。将计数数组中的所有值初始化为 0。
- 遍历两个字符串的每个字符并增加相应计数数组中的字符计数。
- 比较计数数组。如果两个计数数组相同,则返回 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)