• 97. Interleaving String


    问题描述:

     

    Given s1s2s3, find whether s3 is formed by the interleaving of s1 and s2.

    Example 1:

    Input: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac"
    Output: true
    

    Example 2:

    Input: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbbaccc"
    Output: false

    解题思路:

    一开始我想用dfs,若当前s3的首字符能与s1的匹配,则匹配s1.substr(1) , s2, s3.substr(1)

    若不成功则检查s3能否与s2匹配,若能则匹配s1, s2.substr(1), s3

    超时了:)超时了!!!!!!!!!!!!我就知道hard没有这么简单啊朋友们TAT

    遇到这样的字符匹配的题可以考虑dp

    类似题目:72. Edit Distance

    dp[i][j]表示s1前i个字符和s2前j个字符能否插入式构成 s3 前 i+j 个字符串

    初始化:

    当i = 0, j = 0 时,代表前0个字符串,所以一定为true

    dp[i][0] = dp[i-1][0] && (s1[i-1] == s3[i-1])

    dp[0][i] = dp[0][i-1] && (s2[i-1] == s3[i-1])

    状态转移方程:

    dp[i][j] = (dp[i-1][j] && s1[i-1] == s3[i-1] ) || (dp[i][j-1] && s1[j-1] == s3[j-1])

    最后返回dp[len1][len2]

    代码:

    class Solution {
    public:
        bool isInterleave(string s1, string s2, string s3) {
            int len1 = s1.size();
            int len2 = s2.size();
            if(len1+len2 != s3.size())
                return false;
            vector<vector<bool>> dp(len1 + 1, vector<bool>(len2+1, false));
            dp[0][0] = true;
            for(int i = 1; i <= len1; i++){
                dp[i][0] = dp[i-1][0] && (s1[i-1] == s3[i-1]);
            }
            for(int i = 1; i <=len2; i++){
                dp[0][i] = dp[0][i-1] && (s2[i-1] == s3[i-1]);
            }
            for(int i = 1; i <= len1;i++){
                for(int j = 1; j <= len2; j++){
                    dp[i][j] = (dp[i-1][j] && s1[i-1] == s3[i+j-1]) ||(dp[i][j-1] && s2[j-1] == s3[i+j-1]);
                }
            }
            return dp[len1][len2];
        }
    };
  • 相关阅读:
    Unity项目
    Unity基本操作
    博客园自定义主题样式
    明解C语言
    C指针基础知识
    排序算法
    session理解与总结【session原理、应用、与cookie区别】
    cookie理解与实践【实现简单登录以及自动登录功能】
    【数据结构与算法】双指针思想——数组首部或尾部同向遍历
    【数据结构与算法】双指针思想——首尾双向遍历
  • 原文地址:https://www.cnblogs.com/yaoyudadudu/p/9166425.html
Copyright © 2020-2023  润新知