如何在 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 出现次数的算法? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
如何判断两个String是否是Anagrams_java实现
LeetCode算法题-Find All Anagrams in a String(Java实现)