【发布时间】:2019-09-21 10:28:28
【问题描述】:
我正在研究“分组字谜”。 问题陈述:给定一个字符串数组,将字谜组合在一起。
我可以对字谜进行分组,但我无法避免已经分组的字谜。我想避免重复。一个元素只能属于一个组。在我的代码中,一个元素属于多个组。
这是我的代码:
public class GroupAnagrams1 {
public static void main(String[] args) {
String[] input = {"eat", "tea", "tan", "ate", "nat", "bat"};
List<List<String>> result = groupAnagrams(input);
for(List<String> s: result) {
System.out.println(" group: ");
for(String x:s) {
System.out.println(x);
}
}
}
public static List<List<String>> groupAnagrams(String[] strs) {
List<List<String>> result = new ArrayList<List<String>>();
for(int i =0; i < strs.length; i++) {
Set<String> group = new HashSet<String>();
for(int j= i+1; j < strs.length; j++) {
if(areAnagrams(strs[i], strs[j])) {
group.add(strs[i]);
group.add(strs[j]);
}
}
if(group.size() > 0) {
List<String> aList = new ArrayList<String>(group);
result.add(aList);
}
}
return result;
}
这里是检查两个字符串是否是字谜的方法。
private static boolean areAnagrams(String str1, String str2) {
char[] a = str1.toCharArray();
char[] b = str2.toCharArray();
int[] count1 = new int[256];
Arrays.fill(count1, 0);
int[] count2 = new int[256];
Arrays.fill(count2, 0);
for(int i = 0; i < a.length && i < b.length; i++) {
count1[a[i]]++;
count2[b[i]]++;
}
if(str1.length() != str2.length())
return false;
for(int k=0; k < 256; k++) {
if(count1[k] != count2[k])
return false;
}
return true;
}
}
预期输出:
group:
tea
ate
eat
group:
bat
group:
tan
nat
实际输出:
group:
tea
ate
eat
group:
tea
ate
group:
tan
nat
组的显示顺序无关紧要。它的显示方式无关紧要。
偏好:请随意提交使用 HashMaps 的解决方案,但我更愿意看到不使用 HashMaps 和使用 Java8 的解决方案
【问题讨论】:
-
查看您的
if(areAnagrams(strs[i], strs[j]))声明。如果有两个匹配项,您只会添加到组中。你永远不会在一个群体中得到“蝙蝠”。
标签: java