[LeetCode]97. Interleaving String

来源:互联网 发布:ubuntu怎么移动文件夹 编辑:程序博客网 时间:2024/06/05 16:53

[LeetCode]97. Interleaving String

题目描述

这里写图片描述

思路

动态规划
以给出的样例为例

s1 = “aabcc”
s2 = “dbbca”
s3 = “aadbbcbcac”

dp 0 1 a 2 a 3 b 4 c 5 c 0 1 1 1 0 0 0 1 d 0 0 1 1 0 0 2 b 0 0 1 1 1 0 3 b 0 0 1 0 1 1 4 c 0 0 1 0 1 0 5 a 0 0 1 0 1 1

dp数组的状态与他的前面的状态有关,前面的状态表示为上述表格中当前位置的左方或者上方,当前一位置为1时,表示到当前位置是满足的,可以生成当前的字符串,在下一位置时,就需要比较s3的对应位置是否和s1或者s2的对应位置相等

代码

#include <iostream>#include <vector>#include <string>using namespace std;class Solution {public:    bool isInterleave(string s1, string s2, string s3) {        if (s1.size() + s2.size() != s3.size())            return false;        vector<vector<int>> dp(s2.size() + 1, vector<int>(s1.size() + 1));        for (int i = 0; i < s2.size() + 1; ++i) {            for (int j = 0; j < s1.size() + 1; ++j) {                if (i == 0 && j == 0)                    dp[i][j] = 1;                else if (i == 0 && j)                    dp[i][j] = dp[i][j - 1] && s1[j - 1] == s3[i + j - 1];                else if (i && j == 0)                    dp[i][j] = dp[i - 1][j] && s2[i - 1] == s3[i + j - 1];                else                    dp[i][j] = (dp[i][j - 1] && s1[j - 1] == s3[i + j - 1]) || (dp[i - 1][j] && s2[i - 1] == s3[i + j - 1]);            }        }        return dp[s2.size()][s1.size()];    }};int main() {    Solution s;    cout << s.isInterleave("aabcc", "dbbca", "aadbbbaccc") << endl;    system("pause");    return 0;}
0 0
原创粉丝点击