常规解法
先扩大窗口:从左往右找目标字符并记录出现次数。
再缩小窗口:每找到一次目标字符即尝试缩小,看目标字符是否都出现了一次,且记录的字符出现次数大于目标字符应出现次数。
代码
function minWindow($s, $t)
{
// $left、$right 窗口左右边界值
$left = $right = 0;
// $start、$len 最小覆盖子串的开始位置及长度
$start = -1;
$len = PHP_INT_MAX;
// $target、$window 目标子串的各字符出现次数、当前窗口的
$target = $window = [];
$tLen = strlen($t);
for ($i = 0; $i < $tLen; $i++) {
$target[$t[$i]] = isset($target[$t[$i]]) ? $target[$t[$i]] + 1 : 1;
}
// 按目标字符出现顺序进行比较,当目标字符都按顺序出现才返回真
$check = function (&$target, &$window) {
foreach ($target as $k => $v) {
if (!isset($window[$k]) || $window[$k] < $v) {
return false;</