java - 在java中查找字谜
问题描述
我坚持一个问题。我有一个由String[]={"eat", "tea", "tan", "ate", "nat", "bat"}
现在组成的字符串数组,我应该隔离那些上面有相同字母的单词并组成一个组。eat,tea,ate
他们在每个单词中都有相同的字母,所以这是一个组。第 2 组应该是tan,nat
,第 3 组应该是bat
。所以我必须列出一个列表来存储这些组。
我的做法:
为了解决这个问题,我首先找出每个字母的 ascii 值,然后将这些 ascii 值添加到一个单词中。就像eat
找出 ascii 值e,a,t
并添加它们一样。我采用这种方法是因为如果字母在单词中重复,那么它们必须具有相同的 ascii 总和。之后,我将它们分组为相同的 Ascii 总和,并找出哪些单词具有这些总和,然后它们属于同一组。
我的进步 我找出了 ascii 总和并将它们放入哈希图中。但后来我无法对相同的值进行分组。由于我未能对 ascii 值进行分组,因此我找不到单词。我不知道如何进行。
我也关注这个帖子
但是有办法和我的办法不一样。而且问题和我的不一样。我在这里讨论的是一种不同的方法,它取决于 ASCII 值。
我的代码:
public List<List<String>> groupAnagrams(String[] strs) {
ArrayList<Character>indivistr=new ArrayList<>();
ArrayList<Integer>dup=new ArrayList<>();
HashMap<Integer,Integer>mappingvalues=new HashMap<>();
for(int i=0;i<strs.length;i++){
int len=strs[i].length();
int sum=0;
for(int j=0;j<len;j++){
indivistr.add(strs[i].charAt(j));
int ascii=(int)strs[i].charAt(j);
sum=sum+ascii;
}
mappingvalues.put(i,sum);
}
}
另一种方法 是在 Arraylist 中传输映射键并在 ArrayList 中映射值。像这样的东西,
ArrayList<Integer>key_con=new ArrayList<
(mappingvalues.keySet());
ArrayList<Integer>val_con=new ArrayList<>(mappingvalues.values());
然后使用两个循环并将相同的值放入另一个列表中。
for(int k=0;k<val_con.size();k++){
for(int k1=k+1;k1<val_con.size();k1++){
if(val_con.get(k).equals(val_con.get(k1))){
dup.add(val_con.get(k1));
}
}
现在,如果我打印 dup 输出将[314, 314, 314, 323]
是部分正确的。它应该是314,314,314,323,323,311
解决方案
这应该让你开始。
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class Main {
public static void main(String args[]) throws Exception {
String[] words ={"eat", "tea", "tan", "ate", "nat", "bat"};
for(List<String> list : groupAnagrams(words))
System.out.println(list);
}
public static List<ArrayList<String>> groupAnagrams(String[] words) {
List<ArrayList<String>> wordGroups = new ArrayList<ArrayList<String>>();
HashMap<Integer, ArrayList<String>> map = new HashMap<Integer, ArrayList<String>>();
for(String word : words) {
int sum = 0;
for(char c : word.toCharArray())
sum += c;
if(map.containsKey(sum))
map.get(sum).add(word);
else {
ArrayList<String> list = new ArrayList<String>();
list.add(word);
map.put(sum, list);
}
}
for(ArrayList<String> list : map.values())
wordGroups.add(list);
return wordGroups;
}
}
该程序适用于诸如此类的小规模事物,但请考虑以下输入数据:
{“一个”, ”@!”}
这些字符串的总和都是 97。
由于您使用 ASCII 值来查找字谜,您可能会遇到这样的情况。在您开始使用小写字母和大写字母之前,这并不是一个特别紧迫的问题。简单的解决方法就是String.ToUpperCase()
将符号映射到巨大的数字,你就可以开始了。
推荐阅读
- java - 定义不会刷新用户会话的请求
- laravel - 处理来自请求的验证错误
- regex - 正则表达式不计算字符串内的空格
- java - 如何添加默认值
- java - 使用已执行的测试用例名称为每个测试用例创建一个日志文件
- javascript - 如何将值从反应传递到 lit-element 道具
- r - 在使用 for 循环的列表中保存没有异常值的变量时出错
- python - Python 属性类型提示:特定字符串的列表?
- javascript - 如何在退出计时器功能的下一部分功能时播放音频?
- postgresql - PostgreSQL 表中的 UPSERT,DBeaver SQL 编辑器,SQL 错误 [42601]:错误:“for”位置或附近的语法错误:10