ps:本文章仅用来记录日常学习的所思所想,各位看到可取之处也可纳为己用,说的不对的地方还请多多指教。
1.题目描述
438.找到字符串中所有字母异位词(中等)
给定两个字符串
s
和p
,找到s
中所有p
的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。
示例 1:
输入: s = "cbaebabacd", p = "abc" 输出: [0,6] 解释: 起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。 起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。示例 2:
输入: s = "abab", p = "ab" 输出: [0,1,2] 解释: 起始索引等于 0 的子串是 "ab", 它是 "ab" 的异位词。 起始索引等于 1 的子串是 "ba", 它是 "ab" 的异位词。 起始索引等于 2 的子串是 "ab", 它是 "ab" 的异位词。
2.题目分析
我第一时间看到这题,觉得这不是老朋友嘛,于是我用了老办法做。
class Solution {
public List<Integer> findAnagrams(String s, String p) {
int p_length = p.length();
int s_length = s.length();
char[] array_p = p.toCharArray();
Arrays.sort(array_p);
String str_p = new String(array_p);
List<Integer> nums = new ArrayList<>();
for(int i = 0; i <= s_length - p_length;i++){
String str = s.substring(i,i+p_length);
char[] array = str.toCharArray();
Arrays.sort(array);
String str_c = new String(array);
if(str_c.equals(str_p)){
nums.add(i);
}
}
return nums;
}
}
这个就是之前hashmap做字母异位词的老办法,将要找的字符串转化为数组进行排序然后再转化为字符串来找到异位词,方法固然是对的,但对于这道题来说有点慢了。
官方题解是滑动窗口
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;
}
}
在这先按下不表,等我仔细研究了再做分享。(真的有点难懂)