Leetcode 49.字母异位词分组
1.问题描述
2.解决方案
1.一看题就知道大概要用到hash了,但是如何优雅地使用哈希是个问题,从这道题,我们能够得出一个以后字符串的相关哈希的思路就是找共同点作为key,然后value作为具有相同点的元素的集合,其实找相同点这个比较容易想到,但是这个相同点怎么优雅的比较是个问题,一开始我想的是把每一个字符串做成一个map,key是字符,value是出现次数,这样如果map相同那肯定就符合条件了不是,但是很明显很丑陋这个想法,其实说白了就是相同点找的是map,而优雅的相同点应该是排序后的string才对!
2.总结就是找到优雅的相同点!
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
Map<String, List<String>> map = new HashMap<>();
for(String str:strs){
//1.生成key,也即共同点
char[] array = str.toCharArray();
Arrays.sort(array);
String key = new String(array);
//2.
List<String> list = map.getOrDefault(key, new ArrayList<String>());
list.add(str);
map.put(key,list);
}
return new ArrayList<List<String>>(map.values());
}
}
HJ27.查找兄弟单词
1.问题描述
2.解决方案
1.如果相同字符串不算兄弟
2.如果不相同就对当前字符串和目标字符串排序然后比较,如果相同证明不是一个字符串但是排序后相同那就是兄弟字符串
import java.util.*;
public class Main {
public static void main(String[] args) {
//输入 6 cab ad abcd cba abc bca abc 1
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
List<String> list = new ArrayList<>();
for(int i=0;i<n;i++){
list.add(sc.next());
}
//排序标准字符串abc
String str = sc.next();
char[] strs = str.toCharArray();
Arrays.sort(strs);
String strSort = new String(strs);
int k = sc.nextInt();
//逻辑
List<String> ans = new ArrayList<>();
for(int i=0;i<n;i++){
String s = list.get(i);
//相同的不算兄弟字符串
if(str.equals(s)) continue;
//不同的要比较是否是兄弟字符串 排序如果一样就是兄弟字符串
char[] chars = s.toCharArray();
Arrays.sort(chars);
String sSort = new String(chars);
if(strSort.equals(sSort)) ans.add(s);
}
//排序输出
Collections.sort(ans);
System.out.println(ans.size());
if(k<=ans.size()) System.out.println(ans.get(k-1));
}
}