其他分享
首页 > 其他分享> > leetcode87-扰乱字符串

leetcode87-扰乱字符串

作者:互联网

扰乱字符串

dp需要记录s1和s2的起始位置和长度,所以是一个三维dp。
dp[i1][i2][len]表示s1从i1位置开始,s2从i2位置开始,长度为len的两个字符串是否和谐。分为以下几种情况:

  1. 如果两个字符串相等,返回true
  2. 如果字符串不相等,那么从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
  3. 除此之外,两个字符无法拼凑,返回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
来源: https://www.cnblogs.com/xzh-yyds/p/16594648.html