题目来源
题目描述
给定字符串 S and T,找出 S 中最短的(连续)子串 W ,使得 T 是 W 的 子序列 。
如果 S 中没有窗口可以包含 T 中的所有字符,返回空字符串 “”。
如果有不止一个最短长度的窗口,返回开始位置最靠左的那个。
示例 1:
输入:
S = "abcdebdde", T = "bde"
输出:"bcde"
解释:
"bcde" 是答案,因为它在相同长度的字符串 "bdde" 出现之前。
"deb" 不是一个更短的答案,因为在窗口中必须按顺序出现 T 中的元素。
注:
所有输入的字符串都只包含小写字母。
S 长度的范围为 [1, 20000]。
T 长度的范围为 [1, 100]。
题目解析
动态规划
- dp数组定义
- 这种两个字符串的题目,一般都是二维数组。那么dp应该怎么定义呢?
- 确定一个子串的两个关键要素是起始位置和长度,那么我们的dp值是定起始位置还是长度呢?因为起始位置是长度的基础,我们一旦知道了起始位置,那么当前位置减去起始位置,就是长度,所以dp值定义为起始位置
- 即:dp[i][j] 表示范围S中前i个字符包含范围T中前j个字符的子串的起始位置
- 状态转移方程:
- 从最简单的开始举例子:
- 当 S = “b”, T = “b”, 那么我们就有 dp[1][1] = 0。因为s中的起始位置为0,长度为1的子串可以包含T
- 当 S = “d”, T = “b”,那么我们有 dp[1][1] = -1,dp数组初始化为-1,表示无法匹配
- S = “dbd”, T = “bd”,那么dp数组:
- 从最简单的开始举例子:
∅ b d
∅ ? ? ?
d ? -1 -1
b ? 1 -1
d ? 1 1
暴力
以S中每个T的起始字母为起点,然后开始搜索字符串T,然后维护一个子串长度的最小值