使用下面描述的算法可以扰乱字符串 s 得到字符串 t :
如果字符串的长度为 1 ,算法停止
如果字符串的长度 > 1 ,执行下述步骤:
在一个随机下标处将字符串分割成两个非空的子字符串。即,如果已知字符串 s ,则可以将其分成两个子字符串 x 和 y ,且满足 s = x + y 。
随机 决定是要「交换两个子字符串」还是要「保持这两个子字符串的顺序不变」。即,在执行这一步骤之后,s 可能是 s = x + y 或者 s = y + x 。
在 x 和 y 这两个子字符串上继续从步骤 1 开始递归执行此算法。
给你两个 长度相等 的字符串 s1 和 s2,判断 s2 是否是 s1 的扰乱字符串。如果是,返回 true ;否则,返回 false 。

示例 1:

输入:s1 = “great”, s2 = “rgeat”
输出:true
解释:s1 上可能发生的一种情形是:
“great” --> “gr/eat” // 在一个随机下标处分割得到两个子字符串
“gr/eat” --> “gr/eat” // 随机决定:「保持这两个子字符串的顺序不变」
“gr/eat” --> “g/r / e/at” // 在子字符串上递归执行此算法。两个子字符串分别在随机下标处进行一轮分割
“g/r / e/at” --> “r/g / e/at” // 随机决定:第一组「交换两个子字符串」,第二组「保持这两个子字符串的顺序不变」
“r/g / e/at” --> “r/g / e/ a/t” // 继续递归执行此算法,将 “at” 分割得到 “a/t”
“r/g / e/ a/t” --> “r/g / e/ a/t” // 随机决定:「保持这两个子字符串的顺序不变」
算法终止,结果字符串和 s2 相同,都是 “rgeat”
这是一种能够扰乱 s1 得到 s2 的情形,可以认为 s2 是 s1 的扰乱字符串,返回 true
示例 2:

输入:s1 = “abcde”, s2 = “caebd”
输出:false
示例 3:

输入:s1 = “a”, s2 = “a”
输出:true

解题思路

dp[i1][i2][len] 代表 s1[i1,i1+len),s2[i2,i2+len)是否互为扰乱字符串,0代表未判断,1和-1分别代表是和否。
状态转移:两种情况
i为长度,范围是(1到 len-1)

  • 1.没有交换顺序的,直接将s1,s2切割为前一段为i长度,后一端为len-i长度,分别比较s1,s2的两个子串,如果两个子串也是扰乱字符串,当前字符串就满足扰乱字符串的定义。
  • 2.交换顺序后,将s1切割为前一段为i长度,后一端为len-i长度,而将s1切割为前一段为len-i长度,后一端为i长度,将s1的前端和s2的后端作比较,s1的后端和s2前端作比较

代码

public class Solution {int [][][] dp;String ss1,ss2;public boolean isScramble(String s1, String s2) {int n=s1.length();ss1=s1;ss2=s2;dp=new int[n][n][n+1];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(ss1.substring(i1,i1+len).equals(ss2.substring(i2,i2+len))){dp[i1][i2][len]=1;return true;}if(!check(i1,i2,len)){dp[i1][i2][len]=-1;return false;}for(int i=1;i<len;i++){if(dfs(i1, i2, i)&&dfs(i1+i, i2+i, len-i)){dp[i1][i2][len]=1;return true;}if(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;}public boolean check(int i1,int i2,int len){int[] check=new int[26];for (int i=i1;i<i1+len;i++)check[ss1.charAt(i)-'a']++;for(int i=i2;i<i2+len;i++)check[ss2.charAt(i)-'a']--;for(int i=0;i<26;i++)if(check[i]!=0) return false;return true;}}

leetcode 87. 扰乱字符串(dp)相关推荐

  1. LeetCode 87. 扰乱字符串(记忆化递归 / DP)

    文章目录 1. 题目 2. 解题 2.1 记忆化递归 2.2 动态规划 1. 题目 给定一个字符串 s1,我们可以把它递归地分割成两个非空子字符串,从而将其表示为二叉树. 下图是字符串 s1 = &q ...

  2. LeetCode 87. 扰乱字符串(递归)

    题目描述 给定一个字符串 s1,我们可以把它递归地分割成两个非空子字符串,从而将其表示为二叉树. 下图是字符串 s1 = "great" 的一种可能的表示形式. great / g ...

  3. LeetCode 86分割链表87扰乱字符串

    微信搜一搜:bigsai 专注于Java.数据结构与算法,一起进大厂不迷路! 算法文章题解全部收录在github仓库bigsai-algorithm,求star! 关注回复进群即可加入力扣打卡群,欢迎 ...

  4. C#LeetCode刷题-字符串

    字符串篇 # 题名 刷题 通过率 难度 3 无重复字符的最长子串 24.6% 中等 5 最长回文子串 22.4% 中等 6 Z字形变换 35.8% 中等 8 字符串转整数 (atoi) 15.3% 中 ...

  5. 【To Understand !!! DP or 递归】LeetCode 87. Scramble String

    LeetCode 87. Scramble String 参考链接:[1]https://blog.csdn.net/makuiyu/article/details/44926439 [2]http: ...

  6. jsp判断字符串相等_leetcode 86 扰乱字符串(c++)

    ###题目 给定一个字符串 s1,我们可以把它递归地分割成两个非空子字符串,从而将其表示为二叉树,下图是字符串 s1="great"的一种可能的表示形式. 在扰乱这个字符串的过程中 ...

  7. LeetCode 编辑距离 II(DP)

    1. 题目 给你两个单词 s 和 t,请你计算出将 s 转换成 t 所使用的最少操作数. 你可以对一个单词进行如下两种操作: 删除一个字符 替换一个字符 注意: 不允许插入操作 题目保证有解 示例: ...

  8. LeetCode 72. 编辑距离(DP)

    1. 题目 给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 . 你可以对一个单词进行如下三种操作: 插入一个字符 删除一个字符 替换一个字符 示 ...

  9. cif判断字符串相等_leetcode 86 扰乱字符串(c++)

    ###题目 给定一个字符串 s1,我们可以把它递归地分割成两个非空子字符串,从而将其表示为二叉树,下图是字符串 s1="great"的一种可能的表示形式. 在扰乱这个字符串的过程中 ...

最新文章

  1. 基于Pygame写的翻译方法
  2. 清华大学《操作系统》(六):非连续内存分配 段式、页式、段页式存储管理
  3. rust卡领地柜权限_RFID智能医疗耗材柜,上海智能高值耗材柜,国药智能医用耗材柜...
  4. 解决Linux下使用QQ的问题
  5. 中心极限与大数定理律的关系_实数系基本定理(一)
  6. python爬虫解决频繁访问_python爬虫程序如何预防被限制
  7. 哈勃(Hubble)太空望远镜:人类的大眼睛
  8. 更新Windows11出现错误0x80240022的解决方法
  9. yocto编译错误- Error executing a python function in exec_python_func() autogenerated
  10. CSS 多列等高的几种实现方式
  11. 校招信息可以看哪些网站
  12. 三年级计算机怎么进入到游戏,三年级开始,带孩子玩7个游戏训练成“最强大脑”...
  13. 经纬度坐标系转东北天_经纬度坐标系转换
  14. java的基本数据类型有什么特点,java八大基本数据类型
  15. 直流电机控制与TB6612FNG驱动芯片
  16. wish - 简单的窗口式(windowing) shell
  17. TOP-K问题(清晰,巨全)
  18. TDengine踩坑总结
  19. 【t101】小明搬家
  20. 基于wxpy的微信防撤回

热门文章

  1. 【计算机系统设计】实践笔记(6)改进数据通路:lw和sw指令
  2. 详细解释signal和sigaction以及SIG_BLOCK
  3. 阿里P8亲自讲解!java中级开发工程师需要掌握的技能
  4. 经典:区间dp-合并石子
  5. Java内部类的定义和使用
  6. day09_读写分离_Atlas小记
  7. 用户体验设计的五个原则(转)
  8. Ext 与 Jquery 的结合应用
  9. java main方法里调用mapper
  10. c#做端口转发程序支持正向连接和反向链接