📌  相关文章
📜  打印给定字符串数组中的所有字谜对

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

打印给定字符串数组中的所有字谜对

给定一个字符串数组,找出给定数组中的所有字谜对。
例子:

Input: arr[] =  {"geeksquiz", "geeksforgeeks", "abcd",
                 "forgeeksgeeks", "zuiqkeegs"};
Output: (geeksforgeeks, forgeeksgeeks), (geeksquiz, zuiqkeegs)

我们可以使用计数数组在线性时间内找出两个字符串是否是字谜(参见方法 2)。
查找是否所有字谜对的一个简单想法是运行两个嵌套循环。外部循环一一挑选所有字符串。内部循环检查剩余的字符串是否是外部循环选择的字符串的字谜。
下面是这种方法的实现:

C++
#include 
using namespace std;
#define NO_OF_CHARS 256
 
/* function to check whether two strings are anagram of each other */
bool areAnagram(string str1, string str2)
{
    // Create two count arrays 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;
}
 
// This function prints all anagram pairs in a given array of strings
void findAllAnagrams(string arr[], int n)
{
    for (int i = 0; i < n; i++)
        for (int j = i+1; j < n; j++)
            if (areAnagram(arr[i], arr[j]))
                cout << arr[i] << " is anagram of " << arr[j] << endl;
}
 
 
/* Driver program to test to print printDups*/
int main()
{
    string arr[] = {"geeksquiz", "geeksforgeeks", "abcd",
                    "forgeeksgeeks", "zuiqkeegs"};
    int n = sizeof(arr)/sizeof(arr[0]);
    findAllAnagrams(arr, n);
    return 0;
}


Java
// Java program to Print all pairs of
// anagrams in a given array of strings
public class GFG
{
    static final int NO_OF_CHARS = 256;
     
    /* function to check whether two
    strings are anagram of each other */
    static boolean areAnagram(String str1, String str2)
    {
        // Create two count arrays 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 < str2.length();
                                                   i++)
        {
            count[str1.charAt(i)]++;
            count[str2.charAt(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;
 
        // 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;
    }
 
    // This function prints all anagram pairs in a
    // given array of strings
    static void findAllAnagrams(String arr[], int n)
    {
        for (int i = 0; i < n; i++)
            for (int j = i+1; j < n; j++)
                if (areAnagram(arr[i], arr[j]))
                    System.out.println(arr[i] +
                       " is anagram of " + arr[j]);
    }
 
    /* Driver program to test to print printDups*/
    public static void main(String args[])
    {
        String arr[] = {"geeksquiz", "geeksforgeeks",
                        "abcd", "forgeeksgeeks",
                        "zuiqkeegs"};
        int n = arr.length;
        findAllAnagrams(arr, n);
    }
}
// This code is contributed by Sumit Ghosh


Python3
# Python3 program to find
# best meeting point in 2D array
NO_OF_CHARS = 256
 
# function to check whether two strings
# are anagram of each other
def areAnagram(str1: str, str2: str) -> bool:
 
    # Create two count arrays and
    # initialize all values as 0
    count = [0] * NO_OF_CHARS
    i = 0
 
    # For each character in input strings,
    # increment count in the corresponding
    # count array
    while i < len(str1) and i < len(str2):
        count[ord(str1[i])] += 1
        count[ord(str2[i])] -= 1
        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 False
 
    # See if there is any non-zero value
    # in count array
    for i in range(NO_OF_CHARS):
        if count[i]:
            return False
        return True
 
# This function prints all anagram pairs
# in a given array of strings
def findAllAnagrams(arr: list, n: int):
    for i in range(n):
        for j in range(i + 1, n):
            if areAnagram(arr[i], arr[j]):
                print(arr[i], "is anagram of", arr[j])
 
# Driver Code
if __name__ == "__main__":
 
    arr = ["geeksquiz", "geeksforgeeks",
           "abcd", "forgeeksgeeks", "zuiqkeegs"]
    n = len(arr)
    findAllAnagrams(arr, n)
 
# This code is contributed by
# sanjeev2552


C#
// C# program to Print all pairs of
// anagrams in a given array of strings
using System;
 
class GFG
{
    static int NO_OF_CHARS = 256;
     
    /* function to check whether two
    strings are anagram of each other */
    static bool areAnagram(String str1, String str2)
    {
        // Create two count arrays 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 < str2.Length; 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.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;
    }
 
    // This function prints all anagram pairs in a
    // given array of strings
    static void findAllAnagrams(String []arr, int n)
    {
        for (int i = 0; i < n; i++)
            for (int j = i+1; j < n; j++)
                if (areAnagram(arr[i], arr[j]))
                    Console.WriteLine(arr[i] +
                    " is anagram of " + arr[j]);
    }
 
    /* Driver program to test to print printDups*/
    public static void Main()
    {
        String []arr = {"geeksquiz", "geeksforgeeks",
                        "abcd", "forgeeksgeeks",
                        "zuiqkeegs"};
        int n = arr.Length;
        findAllAnagrams(arr, n);
    }
}
 
// This code is contributed by nitin mittal


Javascript


输出:

geeksquiz is anagram of zuiqkeegs
geeksforgeeks is anagram of forgeeksgeeks