LeetCode之Scramble String

来源:互联网 发布:广电网络是上市公司吗 编辑:程序博客网 时间:2024/06/05 18:45
/*动态规划法。设状态为 f[n][i][j],表示长度为 n,起点为 s1[i] 和起点为 s2[j] 两个字符串是否互为 scramble,则状态转移方程为f[n][i][j]} = (f[k][i][j] && f[n-k][i+k][j+k])|| (f[k][i][j+n-k] && f[n-k][i+k][j])。参考自:https://github.com/soulmachine/leetcode*/class Solution {public:    bool isScramble(string s1, string s2) {        if(s1.size() != s2.size()) return false;        bool dp[s1.size()+1][s1.size()][s2.size()];        memset(dp, 0, sizeof(dp));        for(int i = 0; i < s1.size(); ++i){            for(int j = 0; j < s2.size(); ++j)            dp[1][i][j] = (s1[i] == s2[j]);        }                for(int n = 1; n < s1.size() + 1; ++n){            for(int i = 0; i < s1.size(); ++i){                for(int j = 0; j < s2.size(); ++j){                    for(int k = 1; k < n; ++k){                        if((dp[k][i][j] && dp[n-k][i+k][j+k]) ||                        dp[k][i][j+n-k] && dp[n-k][i+k][j]){                            dp[n][i][j] = true;                            break;                        }                    }                }            }        }        return dp[s1.size()][0][0];    }};

0 0
原创粉丝点击