• LC 727. Minimum Window Subsequence 【lock,hard】


    Given strings S and T, find the minimum (contiguous) substring W of S, so that T issubsequenceof W.

    If there is no such window in S that covers all characters in T, return the empty string "". If there are multiple such minimum-length windows, return the one with the left-most starting index.

    Example 1:

    Input: 
    S = "abcdebdde", T = "bde"
    Output: "bcde"
    Explanation: 
    "bcde" is the answer because it occurs before "bdde" which has the same length.
    "deb" is not a smaller window because the elements of T in the window must occur in order.
    

     

    Note:

    • All the strings in the input will only contain lowercase letters.
    • The length of S will be in the range [1, 20000].
    • The length of T will be in the range [1, 100].

    Runtime: 44 ms, faster than 73.35% of C++ online submissions for Minimum Window Subsequence.

    网上的DP解法。dp定义是能够匹配T[0,i]的最大的S的index.

    举个例子,S = babad, T = bad,

    i = 0时,只有当j=0,两个相等,所以此时dp = [0, -1, -1]

    然后,dp = [0,1,-1],然后, dp = [2, 1, -1], -> dp[2,2,-1] -> dp[2,2,2]

    因为时从后往前更新,只有当T的每一个字符都匹配了才能把最开头的index传递到最后。中间即使有些匹配到,如果没有全部匹配也传递不了。

    比如 S = babd, T = bad,

    dp = [-1,-1,-1] -> dp[0,-1,-1] -> dp[0,1,-1] -> dp[2,1,-1] -> dp[2,1,1] 结果还是1.

    class Solution {
    public:
        string minWindow(string S, string T) {
            vector<int> dp(T.length(), -1);
            string ans = "";
            for (int i = 0; i < S.length(); i++) {
                for (int j = T.length() - 1; j >= 0; j--) {
                    if (S[i] == T[j]) {
                        if (j == 0) dp[j] = i;
                        else dp[j] = dp[j - 1];
                    }
                }
                int init = dp[T.length() - 1];
                if (init != -1 && (ans == "" || i - init + 1 < ans.size())) {
                    ans = S.substr(init, i - init + 1);
                }
            }
            return ans;
        }
    };

    这题还有双指针法,过段时间更新。

  • 相关阅读:
    【模板小程序】链表排序(qsort/insert_sort/merge_sort)
    链表回文判断(C++)
    【模板小程序】十进制大数除法(输出商和余数)
    【模板小程序】字符串截取
    【模板小程序】翻转一个句子中的单词
    web前端基础背景
    MongoDB基本知识(补充)
    Python-ORM
    Python-元编程
    ElementUI 中 el-table 获取当前选中行的index
  • 原文地址:https://www.cnblogs.com/ethanhong/p/10160638.html
Copyright © 2020-2023  润新知