题意:

image.png

解题思路:

  1. 思路:滑动窗口,双指针
  2. 1. 初始化T中字符次数,[a => 1, b => 1, c => 1];
  3. 2. 初始化左右指针left right,移动right右窗口,以来找T中对应的字符;
  4. 3. 如果找到T中的所有字符,记录当前[left, right]长度;
  5. 4. 找到全部T,压缩左边窗口,即左滑窗口[0,4] => [1, 5],
  6. 继续移动右窗口,直到找到下一个满足全部T的窗口,继续缩小左边窗口;
  7. 5. 每一次找到全部T字符,记录下最小窗口范围,最后返回最短字符;

PHP代码实现:

  1. class Solution {
  2. /**
  3. * @param String $s
  4. * @param String $t
  5. * @return String
  6. */
  7. function minWindow($s, $t) {
  8. if (strlen($s) < strlen($t)) return '';
  9. $map = [];
  10. for ($i = 0; $i < strlen($t); $i++) ++$map[$t[$i]];
  11. $left = 0; $count = 0;
  12. $min = PHP_INT_MAX;
  13. for ($right = 0; $right < strlen($s); $right++) {
  14. if (isset($map[$s[$right]])) {
  15. //每个要找的值初始是1,找到后总数+1,是为了匹配strlen(s),得到长度
  16. if ($map[$s[$right]] > 0) $count++;//总数+1
  17. $map[$s[$right]]--;
  18. }
  19. while ($count == strlen($t)) {
  20. //找到之后记录长度
  21. if ($right - $left < $min) {
  22. $min = $right - $left;
  23. $head = $left;
  24. $end = $right;
  25. }
  26. //只要找到全部T,就要压缩左边窗口,即左滑窗口[0,4] => [1, 5] => [1, 6]
  27. //首先左滑动窗口,去掉了一个值,就必须在后面元素找到这个值,才能使的长度匹配
  28. //1.总数count--,因为还要找一个【刚左滑动去掉的这个】
  29. //2.map+1,代表我们还要找一个left
  30. if (isset($map[$s[$left]])) {
  31. if ($map[$s[$left]] >= 0) $count--;
  32. //先加一
  33. $map[$s[$left]]++;
  34. }
  35. //匹配之后,移动左边窗口,为了找到右侧最短长度;
  36. $left++;
  37. }
  38. }
  39. if ($min == PHP_INT_MAX) return '';
  40. return substr($s, $head, $end - $head + 1);
  41. }
  42. }

GO代码实现:

  1. func minWindow(s string, t string) string {
  2. mapT := make(map[byte]int)
  3. tlen, slen := len(t), len(s)
  4. for i := 0; i < tlen; i++ {
  5. mapT[t[i]]++
  6. }
  7. count, start, minlen, res := 0, 0, slen, ""
  8. for j := 0; j < slen; j++ {
  9. mapT[s[j]]--
  10. if mapT[s[j]] >= 0 {
  11. count++
  12. }
  13. for count == tlen {
  14. if minlen > j - start {
  15. minlen = j - start
  16. res = s[start:j+1]
  17. }
  18. mapT[s[start]]++
  19. if mapT[s[start]] > 0 {
  20. count--
  21. }
  22. start++
  23. }
  24. }
  25. return res
  26. }