diff --git a/leetcode/src/main/java/com/wyl/leetcode/FindAnagrams.java b/leetcode/src/main/java/com/wyl/leetcode/FindAnagrams.java new file mode 100644 index 0000000..86a0212 --- /dev/null +++ b/leetcode/src/main/java/com/wyl/leetcode/FindAnagrams.java @@ -0,0 +1,95 @@ +package com.wyl.leetcode; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * 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" 的异位词。 + */ +public class FindAnagrams { + public static List findAnagrams(String s, String p) { + char[] chars = p.toCharArray(); + List res = new ArrayList<>(); + int num = chars.length; + Arrays.sort(chars); + String s1 = new String(chars); + for (int i = 0, j = num - 1; j < s.length(); i++, j++) { + String substring = s.substring(i, j + 1); + char[] charsT = substring.toCharArray(); + Arrays.sort(charsT); + if (new String(charsT).equals(s1)) { + res.add(i); + } + } + return res; + } + + public static List findAnagrams1(String s, String p) { + int slen = s.length(), plen = p.length(); + if (slen < plen) { + return new ArrayList<>(); + } + List ans = new ArrayList<>(); + /** + * 字符串s中出现的字符 + */ + int[] sCount = new int[26]; + /** + * 字符串p中出现的所字符,出现了的字符就是1 没有出现就是0 + */ + int[] pCount = new int[26]; + for (int i = 0; i < plen; i++) { + /** + * sCount初始化 p长度的字符 比如 p是abc ,s是 cbadefg 循环做做完 pCount里面只有 abc是1 sCount里面也是cba是1 + */ + sCount[s.charAt(i) - 'a']++; + pCount[p.charAt(i) - 'a']++; + } + /** + * 数组一样 意味着所在的字符一样 + */ + if (Arrays.equals(sCount, pCount)) { + ans.add(0); + } + /** + * 遍历s数组,直到剩余长度不足 p的长度 + */ + for (int i = 0; i < slen - plen; i++) { + /** + * 将遍历过的字符修改为0 + */ + sCount[s.charAt(i) - 'a']--; + /** + * 将遍历到p的长度的字符修改为0 + */ + sCount[s.charAt(i + plen) - 'a']++; + if (Arrays.equals(sCount, pCount)) { + ans.add(i + 1); + } + } + return ans; + } + + public static void main(String[] args) { + System.out.println(findAnagrams1("cbaebabacd", "abc")); + } +}