找到字符串中所有得到字母异位词
给定两个字符串 s
和 p
,找到 s
中所有 p
的
异位词
的子串,返回这些子串的起始索引。不考虑答案输出的顺序。
示例 1:
1 2 3 4 5
| 输入: s = "cbaebabacd", p = "abc" 输出: [0,6] 解释: 起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。 起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。
|
示例 2:
1 2 3 4 5 6
| 输入: 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
仅包含小写字母
维护一个长度为p.length()
的滑动窗口,每次检查窗口内的子串是否和p
互为异位词。所以需要两个哈希数组,分别存储p
和s
中字母出现的频次。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| class Solution { public List<Integer> findAnagrams(String s, String p) { int[] tableP = new int[26]; int[] tableS = new int[26]; List<Integer> list = new ArrayList<>(); for(int i =0;i<p.length();i++){ tableP[p.charAt(i)-'a']++; } for(int l=0,r=0;r<s.length();r++){ tableS[s.charAt(r)-'a']++; if(r-l+1>p.length()){ tableS[s.charAt(l)-'a']--; l++; } if(Arrays.equals(tableP,tableS)){ list.add(l); } } return list; } }
|