leetcode 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" 的异位词。
提示:
1 <= s.length, p.length <= 3 * 104 s 和 p 仅包含小写字母
Related Topics
哈希表
字符串
滑动窗口
滑动窗口+哈希表
class Solution {
public List<Integer> findAnagrams(String s, String p) {
int len1 = s.length();
int len2 = p.length();
int[] map1 = new int[26];
int[] map2 = new int[26];
List<Integer> list = new ArrayList<>();
if(s.length() < p.length()){
return list;
}
for(int i = 0 ; i < len2;i++){
map1[s.charAt(i)-'a']++;
map2[p.charAt(i)-'a']++;
}
int left = 0;
int right = len2-1;
if(fun(map1,map2)){
list.add(0);
}
while(right < len1-1){
map1[s.charAt(left)-'a']--;
left++;
right++;
map1[s.charAt(right)-'a']++;
if(fun(map1,map2)){
list.add(left);
}
}
return list;
}
public boolean fun(int[] map1,int[] map2){
for(int i = 0 ; i < 26;i++){
if(map1[i]!=map2[i]){
return false;
}
}
return true;
}
}
解答成功:
执行耗时:7 ms,击败了84.62% 的Java用户
内存消耗:42.6 MB,击败了10.00% 的Java用户
|