leetcode87-扰乱字符串
- 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;
}
}
本文作者:xzh-yyds
本文链接:https://www.cnblogs.com/xzh-yyds/p/16594648.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步