/*动态规划法。
设状态为 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];
}
};
LeetCode之Scramble String
最新推荐文章于 2024-10-01 18:52:56 发布