算法 最小覆盖子串-(双指针)

牛客网: BM90

题目: 在字符串s中找出包含t中所有字符的最小连续子串

思路: 初始化t中字符量计数map, 遍历t中每个字符,每遇到一个递减1;设置检测函数f,即m中所有key的值都不小于0;初始化双指针slow, fast = 0, 0;left, right = -1, -1遍历s,每遍历一个字符,检测一次f是否满足要求,满足时更新left, right值,同时移动slow,更新m;直到fast走到s的结束。

代码:

// go

package main
// import "fmt"

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param S string字符串 
 * @param T string字符串 
 * @return string字符串
*/

func check(hash map[byte]int) bool {
    for _, v := range hash {
        if v < 0 {
            return false
        }
    }
    return true
}

func minWindow( S string ,  T string ) string {
    // write code here
    cnt := len(S) + 1
    hash := make(map[byte]int)
    for i := 0; i < len(T); i++ {
        hash[T[i]] -= 1
    }
    slow, fast := 0, 0
    left, right := -1, -1
    for ; fast < len(S); fast++ {
        c := S[fast]
        hash[c]++
        for check(hash) {
            if cnt > fast - slow + 1 {
                cnt = fast - slow + 1
                left = slow
                right = fast
            }
            c := S[slow]
            hash[c]--
            slow++
        }
    }
    if left == -1 {
        return ""
    }
    return S[left:right+1]
}

你可能感兴趣的:(牛客网,算法刷题,最小覆盖子串,双指针)