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

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

null

check-whether-two-strings-are-anagram-of-each-other

我们强烈建议您在继续解决方案之前单击此处并进行练习。

方法1(使用排序)

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

以下是上述理念的实施情况:

C++

// C++ program to check whether two strings are anagrams
// of each other
#include <bits/stdc++.h>
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

# Python program to check whether two strings are
# anagrams of each other
# function to check whether two strings are anagram
# of each other
def areAnagram(str1, str2):
# Get lengths of both strings
n1 = len (str1)
n2 = len (str2)
# If length of both strings is not same, then
# they cannot be anagram
if n1 ! = n2:
return 0
# Sort both strings
str1 = sorted (str1)
str2 = sorted (str2)
# Compare sorted strings
for i in range ( 0 , n1):
if str1[i] ! = str2[i]:
return 0
return 1
# Driver code
str1 = "test"
str2 = "ttew"
# 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 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

<script>
// JavaScript program to check whether two strings
// are anagrams of each other
/* function to check whether two strings are
anagram of each other */
function areAnagram(str1,str2)
{
// Get lengths of both strings
let n1 = str1.length;
let n2 = str2.length;
// 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 (let i = 0; i < n1; i++)
if (str1[i] != str2[i])
return false ;
return true ;
}
/* Driver Code*/
let str1=[ 't' , 'e' , 's' , 't' ];
let str2=[ 't' , 't' , 'e' , 'w' ];
// Function Call
if (areAnagram(str1, str2))
document.write( "The two strings are"
+ " anagram of each other<br>" );
else
document.write( "The two strings are not"
+ " anagram of each other<br>" );
// This code is contributed by rag2127
</script>


输出:

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 <bits/stdc++.h>
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 <stdio.h>
#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

<script>
// JAVAscript program to check if two strings
// are anagrams of each other
let NO_OF_CHARS = 256;
/* function to check whether two strings
are anagram of each other */
function areAnagram(str1, str2)
{
// Create 2 count arrays and initialize
// all values as 0
let count1 = new Array(NO_OF_CHARS);
let count2 = new Array(NO_OF_CHARS);
for (let i = 0; i < NO_OF_CHARS; i++)
{
count1[i] = 0;
count2[i] = 0;
}
let 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].charCodeAt(0)]++;
count2[str1[i].charCodeAt(0)]++;
}
// 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*/
let str1 = ( "geeksforgeeks" ).split( "" );
let str2 = ( "forgeeksgeeks" ).split( "" );
// Function call
if (areAnagram(str1, str2))
document.write( "The two strings are"
+ "anagram of each other<br>" );
else
document.write( "The two strings are not"
+ " anagram of each other<br>" );
// This code is contributed by avanitrachhadiya2155
</script>


输出:

The two strings are anagram of each other

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

C++

// C++ program to check if two strings
// are anagrams of each other
#include <bits/stdc++.h>
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

<script>
// Javascript program to check if two strings
// are anagrams of each other
let NO_OF_CHARS = 256;
// function to check if two strings
// are anagrams of each other
function areAnagram(str1, str2)
{
// Create a count array and initialize
// all values as 0
let count = new Array(NO_OF_CHARS);
for (let i = 0; i < NO_OF_CHARS; i++)
{
count[i] = 0;
}
let i;
// For each character in input strings,
// increment count in the corresponding
// count array
for (i = 0; i < str1.length; i++)
{
count[str1[i].charCodeAt(0) - 'a' .charCodeAt(0)]++;
count[str2[i].charCodeAt(0) - 'a' .charCodeAt(0)]--;
}
// 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
let str1 = "geeksforgeeks" .split( "" );
let str2 = "forgeeksgeeks" .split( "" );
// Function call
if (areAnagram(str1, str2))
document.write( "The two strings are " +
"anagram of each other" );
else
document.write( "The two strings are " +
"not anagram of each other" );
// This code is contributed by unknown2108.
</script>


输出:

The two strings are anagram of each other

时间复杂性: O(n)

方法4(将所有字符放入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<Character, Integer> 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<Character> 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< char , int > map = new Dictionary< char , int >();
// 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)

如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。

© 版权声明
THE END
喜欢就支持一下吧
点赞14 分享