438.查找字符串中的所有字母反义词
最编程
2024-03-15 14:04:36
...
给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引。
字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100。
说明:
字母异位词指字母相同,但排列不同的字符串。
不考虑答案输出的顺序。
输入: 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" 的字母异位词。
解决思路:滑动窗口
class Solution { public List<Integer> findAnagrams(String s, String p) { List<Integer> result=new ArrayList<>(); if(s==null || p==null){ return result; } char[] schar = s.toCharArray(); char[] pchar=p.toCharArray(); int l=0; int r=-1; int originLen=schar.length; int targetLen=pchar.length; int[] sfreq=new int[26]; int[] pfreq=new int[26]; for(int i=0;i<targetLen;i++){ int pos=pchar[i]-'a'; pfreq[pos]++; } while(l<originLen){ if(r+1<originLen&&(r+1-l)<targetLen){ int pos=schar[++r]-'a'; sfreq[pos]++; }else{ if((r+1-l)==targetLen&&isSame(l,r,schar,sfreq,pfreq)){ result.add(l); } int pos=schar[l++]-'a'; sfreq[pos]--; } } return result; } boolean isSame(int l,int r,char[] schar,int[] sfreq,int[] pfreq){ for(int i=l;i<=r;i++){ int pos=schar[i]-'a'; if(sfreq[pos]!=pfreq[pos]) return false; } return true; } }
上一篇: 异或运算
下一篇: 什么是异或_异或运算和异或运算的作用