2022-7-25 剑指offer-滑动窗口
给定两个字符串 s
和 p
,找到 s
中所有 p
的 变位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。
变位词 指字母相同,但排列不同的字符串。
1 class Solution { 2 public List<Integer> findAnagrams(String s, String p) { 3 int n=s.length(),m=p.length(); 4 List<Integer> list=new ArrayList<>(); 5 if (n<m) return list; 6 int[] cnt=new int[26]; 7 int diff=0; 8 for (int i=0;i<m;i++){ 9 cnt[s.charAt(i)-'a']++; 10 cnt[p.charAt(i)-'a']--; 11 } 12 for (int x:cnt){ 13 if (x!=0) diff++; 14 } 15 if (diff==0) list.add(0); 16 for (int i=0;i<n-m;i++) { 17 if (cnt[s.charAt(i) - 'a'] == 1) diff--; 18 else if (cnt[s.charAt(i) - 'a'] == 0) diff++; 19 cnt[s.charAt(i) - 'a']--; 20 if (cnt[s.charAt(i+m) - 'a'] == -1) diff--; 21 else if (cnt[s.charAt(i+m) - 'a'] == 0) diff++; 22 cnt[s.charAt(i + m) - 'a']++; 23 if (diff == 0) list.add(i+1); 24 } 25 return list; 26 } 27 }
思路:采用昨天的diff方法来快速判断是否为异味词。