- dp
dp需要记录s1和s2的起始位置和长度,所以是一个三维dp。
dp[i1][i2][len]
表示s1从i1位置开始,s2从i2位置开始,长度为len的两个字符串是否和谐。分为以下几种情况:
- 如果两个字符串相等,返回true
- 如果字符串不相等,那么从1到len-1的范围内,找出分割点i。如果
dp[i1][i2][i] && dp[i1+i][i2+i][len-i]
成立或者dp[i1][i2+len-i][i] && dp[i1+len-i][i2][len-i]
成立,那么表明这两个字符经过分割之后可以重新拼凑,则返回true - 除此之外,两个字符无法拼凑,返回false
这里的dp初始值为0,表示未被更改。如果dp值为1表示true,dp值为-1表示false
class Solution {
int dp[][][];
String s1 = null, s2 = null;
public boolean isScramble(String s1, String s2) {
int n = s1.length();
if(s2.length() != n) return false;
dp = new int[n][n][n+1];
this.s1 = s1;
this.s2 = s2;
return dfs(0, 0, n);
}
public boolean dfs(int i1, int i2, int len){
if(dp[i1][i2][len] != 0) return dp[i1][i2][len] == 1;
if(s1.substring(i1, i1+len).equals(s2.substring(i2, i2+len))){
dp[i1][i2][len] = 1;
return true;
}
for(int i = 1; i < len; i++){
if(dfs(i1, i2, i) && dfs(i1+i, i2+i, len-i) || dfs(i1, i2+len-i, i) && dfs(i1+i, i2, len-i)){
dp[i1][i2][len] = 1;
return true;
}
}
dp[i1][i2][len] = -1;
return false;
}
}
标签:扰乱,leetcode87,s2,s1,i2,len,i1,字符串,dp
From: https://www.cnblogs.com/xzh-yyds/p/16594648.html