ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

leetcode87-扰乱字符串

2022-08-17 12:33:18  阅读:142  来源: 互联网

标签:扰乱 leetcode87 s2 s1 i2 len i1 字符串 dp


扰乱字符串

  • dp

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有