2021-08-30:给定两个字符串str1和str2,在str1中寻找一个最短子串,能包含str2的所有字符,字符顺序无所谓,str1的这个最短子串也可以包含多余的字符。返回这个最短包含子串。(代码

Posted 福大大架构师每日一题

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021-08-30:给定两个字符串str1和str2,在str1中寻找一个最短子串,能包含str2的所有字符,字符顺序无所谓,str1的这个最短子串也可以包含多余的字符。返回这个最短包含子串。(代码相关的知识,希望对你有一定的参考价值。

2021-08-30:给定两个字符串str1和str2,在str1中寻找一个最短子串,能包含str2的所有字符,字符顺序无所谓,str1的这个最短子串也可以包含多余的字符。返回这个最短包含子串。

福大大 答案2021-08-30:

滑动+哈希。对str2欠账表哈希,对str1滑动窗口。
时间复杂度:O(N)。
空间复杂度:O(1)。哈希是256的固定长度。

代码用golang编写。代码如下:

package main

import (
    "fmt"
    "math"
)

func main() {
    s1 := "abcxa"
    s2 := "aabc"
    ret := minLength(s1, s2)
    fmt.Println(ret)
}

func minLength(s1 string, s2 string) int {
    if len(s1) < len(s2) {
        return math.MaxInt64
    }
    map0 := make([]int, 256) // map[37] = 4  37  4次
    for i := 0; i != len(s2); i++ {
        map0[s2[i]]++
    }
    all := len(s2)

    // [L,R-1]  R
    // [L,R)  -> [0,0)
    L := 0
    R := 0
    minLen := math.MaxInt64
    for R != len(s1) {
        map0[s1[R]]--
        if map0[s1[R]] >= 0 {
            all--
        }
        if all == 0 { // 还完了
            for map0[s1[L]] < 0 {
                map0[s1[L]]++
                L++
            }
            // [L..R]
            minLen = getMin(minLen, R-L+1)
            all++
            map0[s1[L]]++
            L++
        }
        R++
    }

    if minLen == math.MaxInt64 {
        return 0
    } else {
        return minLen
    }
}

func getMin(a int, b int) int {
    if a < b {
        return a
    } else {
        return b
    }
}

执行结果如下:


左神java代码

以上是关于2021-08-30:给定两个字符串str1和str2,在str1中寻找一个最短子串,能包含str2的所有字符,字符顺序无所谓,str1的这个最短子串也可以包含多余的字符。返回这个最短包含子串。(代码的主要内容,如果未能解决你的问题,请参考以下文章

判断两个字符串是否互为变形词

动态规划-最长公共子序列LCS

每日一题 为了工作 2020 0418 第四十七题

最小编辑代价-golang

动态规划 最小编辑代价

字符串问题----判断两个字符串是否互为变形词