属于hashTable
题目描述:
Given an array of strings, group anagrams together.
Example:
Input: ["eat", "tea", "tan", "ate", "nat", "bat"]
,
Output:
[
["ate","eat","tea"],
["nat","tan"],
["bat"]
]
Note:
- All inputs will be in lowercase.
- The order of your output does not matter.
思路:
用一个hashmap存储:key是字符串(元素)的字典排序,value存储的是该类似的字符串在lists中的存储位置
新来一个字符串:先查看这个字符串的字典排序是否已经在hashmap中了,如果有,说明lists中也已经存在类似的了,直接在相应list添上就好了;如果没有:说明这是第一个,就把它的字典排序存放到hashmap中,并记录这是第几个存放到lists中的,并且在lists中新添加一个list来存放
有一个易错点,就是“接在相应list添上就好了”,这里直接:
lists.get(weizhi).add(strs[i]);
而不能:注意这里直接在里面操作,不要再拿出来,再放进去,会出错的!!!!!!!!!
List<String> list = lists.get(weizhi);
list.add(strs[i]);
lists.add(weizhi , list);
冒泡排序:
字符数组与字符串的相互转换:
https://www.cnblogs.com/chengzilomo/p/5063881.html
方法一:直接用数组转字符串方法效果如下
char[] c1 = new char[]{'a','d','s'}; return = Arrays.toString(c1);
输出效果:[a, d, s]
方法三:推荐使用
char[] c4 = new char[]{'a','d','s','a','d','s'}; return new String(c4);
输出效果:adsads
本题代码:
//求字符串的字典排序
public static String zidian(String str){
//冒泡:从小到大
int n = str.length();
char[] chars = str.toCharArray();
for(int i = 0;i<n-1;i++){
for(int j = 0;j<n-i-1;j++){
if(chars[j]>chars[j+1]){
//交换
char ch = chars[j];
chars[j] = chars[j+1];
chars[j+1] = ch;
}
}
}
return Arrays.toString(chars);
}
public static List<List<String>> groupAnagrams(String[] strs) {
List<List<String>> lists = new ArrayList<List<String>>();
Map<String,Integer> map = new HashMap<String, Integer>();
int lists_count = 0;
for(int i = 0 ;i<strs.length;i++){
//如果存在的话,就加入到list的相应位置
if(map.containsKey(zidian(strs[i]))){
int weizhi = map.get( zidian(strs[i]) );
lists.get(weizhi).add(strs[i]);
//List<String> list = lists.get(weizhi);
//list.add(strs[i]);
//lists.add(weizhi , list);
//注意这里直接在里面操作,不要再拿出来,再放进去,会出错的!!!!!!!!!
}else {
//如果不存在的话,就加入到lists中
List<String> list = new ArrayList<String>();
list.add(strs[i]);
lists.add(list);
lists_count++;
//并且把strs[i]的元素 和 在lists中的位置 存入到hashmap中
map.put(zidian(strs[i]),lists_count-1);
}
}
return lists;
}
public static void main(String[] args) {
String [] strs = {"eat", "tea", "tan", "ate", "nat", "bat"};
List<List<String>> lists = groupAnagrams(strs);
for(int i = 0 ;i<lists.size();i++){
for(int j =0 ;j<lists.get(i).size();j++){
System.out.print(lists.get(i).get(j)+" ");
}
System.out.println("");
}
}