第49题
https://leetcode.cn/problems/group-anagrams/description/
解题代码
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
HashMap<String,List<String >> map= new HashMap<> ();//建立一个hashmap表
for(String str:strs){
char[] array = str.toCharArray();//将string格式转为char数组,为了用Arrays的排序
Arrays.sort(array);
String key= new String(array);//将数组转为字符串
List<String> list = map.getOrDefault(key, new ArrayList<String>());
//如果map中有key,返回key的值放入list中,如果没有,新建一个ArrayList<String>
list.add(str);
map.put(key, list);
}
return new ArrayList<List<String>>(map.values());
}
}
438.
解题代码
class Solution {
public List<Integer> findAnagrams(String s, String p) {
//思路:将p按照顺序排列成字符串
//建立一个数组,用来存储返回值
//指针从s的头遍历,遍历p的长度,按顺序排列与p的string比较是否相等,相等就返回一个值
char[] arr=p.toCharArray();
Arrays.sort(arr);
//没考虑s<p
List num =new ArrayList();
for(int i=0;i<s.length()-p.length()+1;i++){
String str = s.substring(i,i+p.length());
char[] chars = str.toCharArray();
Arrays.sort(chars);
if(Arrays.equals(chars,arr)){
num.add(i);
}
}
return num;
}
}
官方代码
class Solution {
public List<Integer> findAnagrams(String s, String p) {
int sLen = s.length(), pLen = p.length();
if (sLen < pLen) {
return new ArrayList<Integer>();
}
List<Integer> ans = new ArrayList<Integer>();
int[] sCount = new int[26];
int[] pCount = new int[26];
for (int i = 0; i < pLen; ++i) {
++sCount[s.charAt(i) - 'a'];//计数,看每个字母有几个
++pCount[p.charAt(i) - 'a'];
}
if (Arrays.equals(sCount, pCount)) {
ans.add(0);//第一个字符就符合条件
}
for (int i = 0; i < sLen - pLen; ++i) {//开始滑动,窗口每次滑动一位
--sCount[s.charAt(i) - 'a'];//减去前一个窗口的值
++sCount[s.charAt(i + pLen) - 'a'];//在滑动窗口内维护每一个字母的数量
//加上滑动后新加入的值
if (Arrays.equals(sCount, pCount)) {
ans.add(i + 1);
}
}
return ans;
}
}
作者:力扣官方题解
链接:https://leetcode.cn/problems/find-all-anagrams-in-a-string/solutions/1123971/zhao-dao-zi-fu-chuan-zhong-suo-you-zi-mu-xzin/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。