如何在 java 中编写 Anagrams 出现次数的算法? [关闭]

Posted

技术标签:

【中文标题】如何在 java 中编写 Anagrams 出现次数的算法? [关闭]【英文标题】:How to write algorithm for Count Occurrences of Anagrams in java? [closed] 【发布时间】:2021-02-07 09:49:27 【问题描述】:

嗨,我想用 java 写字谜算法。我的要求是如果有人给了这样的字符串

Input: "aa aa odg dog gdo" 它的字谜计数应该是 2。谁能帮我解决这个问题? 我尝试了一个解决方案,但它不起作用。

public static void main(String[] args) 
        String text = "a c b c run urn urn";
        String word = "urn";
        System.out.print(countAnagrams(text, word));

    

    static boolean araAnagram(String s1,
                              String s2)
    
        char[] ch1 = s1.toCharArray();
        char[] ch2 = s2.toCharArray();
        Arrays.sort(ch1);
        Arrays.sort(ch2);
        if (Arrays.equals(ch1, ch2))
            return true;
        else
            return false;
    

    static int countAnagrams(String text, String word)
    
        int N = text.length();
        int n = word.length();
        int res = 0;
        for (int i = 0; i <= N - n; i++) 

            String s = text.substring(i, i + n);
            if (araAnagram(word, s))
                res++;
        
        return res;
    

这个程序不符合我的要求 请帮忙。

【问题讨论】:

aa aa odg dog gdo 在这里,您找到的字谜词是什么?什么不起作用? @Eklavya-UpvoteDon'tSayThanks 例如:如果字符串是“cars are very cool so are arcs and my os”,那么您的程序应该返回 2,因为“cars”和“arcs”形成 1 个字谜“so”和“os”构成第二个字谜。 “are”这个词在字符串中出现了两次,但它不是一个字谜,因为它只是重复的同一个词。我想改变上面的程序以适应这个而不是传递两个字符串。 为什么输入 "aa aa odg dog gdo" 应该返回 2 个字谜?根据您的评论,aa 重复了两次,因此不应算作字谜。 【参考方案1】:

假设有一种方法可以将一个单词转换成一个有序的字符序列,那么可以使用Stream API来计算字谜的个数:

static String anagram(String s) 
    char[] arr = s.toCharArray();
    Arrays.sort(arr);
    return new String(arr);


static long countAnagrams(String input) 
    if (null == input || input.isEmpty()) 
        return 0;
    
    return Arrays.stream(input.split("\\s+"))  // Stream of words
            .distinct()  // get unique words and
            // move them into Map<String, List<String>>, where List contains all anagrams contained in the input string
            .collect(Collectors.groupingBy(MyClass::anagram)) 
            .entrySet() // 
            .stream()   // stream of entries 
            .filter(e -> e.getValue().size() > 1) // filter values with at least two anagrams
            .peek(e -> System.out.println(e.getValue())) // debug print of the anagram list
            .count(); // and count them

测试:

String[] tests = 
    "aa aa odg dog gdo",
    "cars are very cool so are arcs and my os"
;

Arrays.stream(tests)
      .forEach(s -> System.out.printf("'%s' -> anagram count=%d%n", s, countAnagrams(s)));

输出

[odg, dog, gdo]
'aa aa odg dog gdo' -> anagram count=1
[so, os]
[cars, arcs]
'cars are very cool so are arcs and my os' -> anagram count=2

【讨论】:

【参考方案2】:

这个可以解决。

public static boolean anagrams(String s1, String s2)
    if(!(s1.equalsIgnoreCase(s2)))
        char[] ch1 = s1.toCharArray();
        char[] ch2 = s2.toCharArray();
        Arrays.sort(ch1);
        Arrays.sort(ch2);
        return Arrays.equals(ch1,ch2);
    
    return false;


public static String CountingAnagrams(String str) 
    int res = 0;
    String[] splitStr = str.split("\\s+");
    for(int i = 0 ; i< splitStr.length; i++)
        for (int j = i + 1; j < splitStr.length; j++)
            if (anagrams(splitStr[i], splitStr[j]))
                res++;
    return String.valueOf(res-1);

【讨论】:

以上是关于如何在 java 中编写 Anagrams 出现次数的算法? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

算法训练 Anagrams问题

查看两个字符串是不是为 Anagrams [C++]

如何判断两个String是否是Anagrams_java实现

LeetCode算法题-Find All Anagrams in a String(Java实现)

Java - 迭代 ArrayList 并查找 Anagrams

从字典文件中读取的 Java Anagrams