49.字母异位词分组
题目
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
示例 1:
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
代码(map)
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
//用map处理不同字母异位词的分组
//key表示某个str的升序字符串
//value表示对应key的所有str
Map<String,List<String>> map = new HashMap<>();
//遍历每一个字符串str,"cba"
for(String str: strs){
char[] chs = str.toCharArray(); //把str转为字符数组chs,{'c','b','a'}
Arrays.sort(chs); //把字符数组chs升序排序,{'a','b','c'}
String key = new String(chs); //把chs转为String,作为key,"abc"
//在map中找是否存在这个key"abc",如果存在返回对应的value列表
//如果不存在,就new一个空的ArrayList
List<String> value = map.getOrDefault(key,new ArrayList<>());
value.add(str); //把当前的"cba"字符串加入value
map.put(key,value); //更新key和value
}
//获取map中value集合,map.values()返回值是Collection类型的
//下面2种方式都能够把它转为List类型
List<List<String>> res = new ArrayList<>(map.values()); //构造方法赋值
//List<List<String>> res = map.values().stream().collect(Collectors.toList());
return res;
}
}
438.找到字符串中所有字母异位词
题目
给定两个字符串 s
和 p
,找到 s
中所有 p
的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。
异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。
示例 1:
输入: s = "cbaebabacd", p = "abc" 输出: [0,6] 解释: 起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。 起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。
代码(直接排序比较是否为异位词)
class Solution {
public List<Integer> findAnagrams(String s, String p) {
//判断异位词逻辑:把String转为chs,升序排序后转回String
List<Integer> res = new ArrayList<>();
char[] chs = p.toCharArray(); //把p转为字符数组,"cba"->{'c','b','a'};
Arrays.sort(chs); //把p升序排序,{'a','b','c'};
String sortP = new String(chs); //把p转为升序排序后的字符串"abc"
//s长度为10,p长度为3,i最多只能走到7的位置
for(int i=0; i <= s.length()-p.length();i++){
String sub = s.substring(i,i+p.length()); //获取s中的子串sub,截取索引[i,i+p.length())
char[] subChs = sub.toCharArray(); //把子串转为字符数组
Arrays.sort(subChs); //子串升序
String sortSub = new String(subChs); //子串转为String
if(sortSub.equals(sortP)){ //说明该子串的升序结果和p的升序结果一样,是异位词
res.add(i);
}
}
return res;
}
}
350.两个数组的交集II
题目
给你两个整数数组 nums1
和 nums2
,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。
示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2] 输出:[2,2]
示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4] 输出:[4,9]
代码(map)
class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
Map<Integer,Integer> map = new HashMap<>();
List<Integer> list = new ArrayList<>();
//遍历nums1,数-出现次数
for(int i : nums1){
map.put(i,map.getOrDefault(i,0)+1);
}
for(int i : nums2){
//遍历nums2,在map中是否存在key
if(map.containsKey(i)){
list.add(i); //存在,说明是交集,add到list中
map.put(i,map.get(i)-1); //map对该key的value-1
if(map.get(i) == 0){ //如果key的value为0,移除
map.remove(i);
}
}
}
//这三种方法可以把List转为Integer数组
//Integer[] res = list.stream().toArray(Integer[]::new);
//Integer[] res = list.stream().toArray(value -> new Integer[value]);
//Integer[] res = list.toArray(Integer[]::new);
//把list转为int数组返回
int[] res = new int[list.size()];
int index = 0;
for(Integer i : list){
res[index++] = i;
}
return res;
}
}