问题描述:给定两个长度相同的字符串,问两个字符串的字符种类及个数是否相同?

  1. String s, t;
  2. int[] c = new int[26];
  3. int diff = 0;
  4. for (int i = 0; i < n; i++) {
  5. char a = s.charAt(i), b = t.charAt(i);
  6. if (++c[a-'a'] == 1) diff++;
  7. if (--c[b-'a'] == 0) diff--;
  8. }
  9. if (diff == 0) return true;
  10. else return false;

76. 最小覆盖子串

思路:
统计t串字符的种类和个数,用滑动窗口在s中找到包含t中所有字符的最短子串。
用到了上面提到的技巧。

  1. class Solution {
  2. public String minWindow(String s, String t) {
  3. int n = s.length(), m = t.length();
  4. int[] cnt = new int[128];
  5. int diff = 0;
  6. for (int i = 0; i < m; i++) {
  7. char c = t.charAt(i);
  8. cnt[c]++;
  9. if (cnt[c] == 1)
  10. diff++;
  11. }
  12. int l = -1, r = -1, len = 0x3f3f3f3f;
  13. for (int i = 0, j = 0, d2 = 0; i < n; i++) {
  14. char c = s.charAt(i);
  15. cnt[c]--;
  16. if (cnt[c] == 0)
  17. d2++;
  18. while (d2 == diff && cnt[s.charAt(j)] < 0) {
  19. cnt[s.charAt(j)]++;
  20. j++;
  21. }
  22. if (d2 == diff && i - j + 1 < len) {
  23. len = i - j + 1;
  24. l = j;
  25. r = i;
  26. }
  27. }
  28. return r == -1 ? "" : s.substring(l, r + 1);
  29. }
  30. }

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” 的异位词。

提示:

  • 1 <= s.length, p.length <= 3 * 104
  • 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> res = new ArrayList<>();
  5. if (n < m)
  6. return res;
  7. int[] cnt = new int[26];
  8. int diff = 0;
  9. for (int i = 0; i < m; i++) {
  10. if (++cnt[s.charAt(i) - 'a'] == 1)
  11. diff++;
  12. if (--cnt[p.charAt(i) - 'a'] == 0)
  13. diff--;
  14. }
  15. for (int i = m, j = 0; i < n; i++, j++) {
  16. if (diff == 0)
  17. res.add(j);
  18. if (--cnt[s.charAt(j) - 'a'] == 0)
  19. diff--;
  20. if (++cnt[s.charAt(i) - 'a'] == 1)
  21. diff++;
  22. }
  23. if (diff == 0)
  24. res.add(n - m);
  25. return res;
  26. }
  27. }