题目描述
给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。
异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。
示例 1:
1 2 3 4 5
| 输入: s = "cbaebabacd", p = "abc" 输出: [0,6] 解释: 起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。 起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。
|
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/find-all-anagrams-in-a-string
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
我的题解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| class Solution { public List<Integer> findAnagrams(String s, String p) { List<Integer> result=new ArrayList(); int pLen=p.length(); int sLen=s.length(); String pSort=strSort(p); for(int i=0;i+pLen<=sLen;i++) { if(pSort.equals(strSort(s.substring(i,i+pLen)))) { result.add(i); } } return result; } public String strSort(String str) { char[] ch=str.toCharArray(); Arrays.sort(ch); return String.valueOf(ch); } }
|
思路为将s的子串和p重新排序输出字符串,然后让s的子串向左滑动,求出满足异位词条件的索引。
大神题解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| class Solution { public List<Integer> findAnagrams(String s, String p) { List<Integer> ans=new ArrayList<Integer>();
int sLen=s.length(); int pLen=p.length();
if(sLen<pLen){ return ans; } 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; } }
|
https://leetcode.cn/problems/find-all-anagrams-in-a-string/solution/zhao-dao-zi-fu-chuan-zhong-suo-you-zi-mu-xzin/
该网址的评论区。
思路大致也是滑动窗口,但是比较字符串是不是异位词和我的不一样,该方法比较异位词是将s的子串和p的字母放到了数组中,通过比较p和s的子串的数组中字母的频数一不一样来判断是否是异位词,通过–scount和++scount来控制窗口的滑动。