原题链接: http://oj.leetcode.com/problems/scramble-string/ 
这道题看起来是比較复杂的,假设用brute force,每次做分割,然后递归求解,是一个非多项式的复杂度,一般来说这不是面试官想要的答案。
这事实上是一道三维动态规划的题目,我们提出维护量res[i][j][n],当中i是s1的起始字符,j是s2的起始字符,而n是当前的字符串长度,res[i][j][len]表示的是以i和j分别为s1和s2起点的长度为len的字符串是不是互为scramble。
有了维护量我们接下来看看递推式,也就是怎么依据历史信息来得到res[i][j][len]。推断这个是不是满足,事实上我们首先是把当前s1[i...i+len-1]字符串劈一刀分成两部分,然后分两种情况:第一种是左边和s2[j...j+len-1]左边部分是不是scramble,以及右边和s2[j...j+len-1]右边部分是不是scramble;另外一种情况是左边和s2[j...j+len-1]右边部分是不是scramble,以及右边和s2[j...j+len-1]左边部分是不是scramble。假设以上两种情况有一种成立,说明s1[i...i+len-1]和s2[j...j+len-1]是scramble的。而对于推断这些左右部分是不是scramble我们是有历史信息的,由于长度小于n的全部情况我们都在前面求解过了(也就是长度是最外层循环)。
上面说的是劈一刀的情况,对于s1[i...i+len-1]我们有len-1种劈法,在这些劈法中仅仅要有一种成立,那么两个串就是scramble的。
总结起来递推式是res[i][j][len] = || (res[i][j][k]&&res[i+k][j+k][len-k] || res[i][j+len-k][k]&&res[i+k][j][len-k]) 对于全部1<=k<len,也就是对于全部len-1种劈法的结果求或运算。由于信息都是计算过的,对于每种劈法仅仅须要常量操作就可以完毕,因此求解递推式是须要O(len)(由于len-1种劈法)。
如此总时间复杂度由于是三维动态规划,须要三层循环,加上每一步须要线行时间求解递推式,所以是O(n^4)。尽管已经比較高了,可是至少不是指数量级的,动态规划还是有非常大有事的,空间复杂度是O(n^3)。代码例如以下:

public boolean isScramble(String s1, String s2) {if(s1==null || s2==null || s1.length()!=s2.length())return false;if(s1.length()==0)return true;boolean[][][] res = new boolean[s1.length()][s2.length()][s1.length()+1];for(int i=0;i<s1.length();i++){for(int j=0;j<s2.length();j++){res[i][j][1] = s1.charAt(i)==s2.charAt(j);}}for(int len=2;len<=s1.length();len++){for(int i=0;i<s1.length()-len+1;i++){for(int j=0;j<s2.length()-len+1;j++){for(int k=1;k<len;k++){res[i][j][len] |= res[i][j][k]&&res[i+k][j+k][len-k] || res[i][j+len-k][k]&&res[i+k][j][len-k];}}}}return res[0][0][s1.length()];
}

个人认为这是LeetCode中最难的动态规划的题目了,要进行一次三维动态规划,对于维护量的含义也比較讲究。有朋友会讨论这个维护量是怎么提出来的,我自己也没什么绝对的方法,还是熟能生巧,靠“感觉”,做的题目多了就自然来了,这个做高中数学题有点类似哈,辅助线是靠“灵感”的哈。面试中假设遇到就是top难度的了,只是即使如此,仅仅要思路清晰,还是能够记住的。假设没做过,个人认为比較难当场想出来,只是算法大牛就另说了,这样的题非常常常出如今编程比赛中,ACM高手还是不在话下的哈。

转载于:https://www.cnblogs.com/mfrbuaa/p/3762262.html

Scramble String -- LeetCode相关推荐

  1. LeetCode Scramble String

    LeetCode解题之Scramble String 原题 一个字符串能够拆分成两个都不为空的子字符串,而子字符串(长度大于等于二)也能够不断这样拆分下去.如今能够随意交换拆分出来两部分的位置来改变字 ...

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

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

  3. 【LeetCode】87. Scramble String

    题目: Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty subs ...

  4. 806. Number of Lines To Write String - LeetCode

    为什么80%的码农都做不了架构师?>>>    Question 806. Number of Lines To Write String Solution 思路:注意一点,如果a长 ...

  5. 345. Reverse Vowels of a String - LeetCode

    Question 345. Reverse Vowels of a String Solution 思路:交换元音,第一次遍历,先把出现元音的索引位置记录下来,第二遍遍历元音的索引并替换. Java实 ...

  6. number to string - LeetCode【数字 = 字符串】

    228. Summary Ranges 让我们找出连续的序列,然后首尾两个数字之间用个"->"来连接,那么我只需遍历一遍数组即可,每次检查下一个数是不是递增的,如果是,则继续 ...

  7. 0028. Find the Index of the First Occurrence in a string (leetcode in python day7)

    文章目录 一.列表的切片 二.solution 一.列表的切片 当我们想一次访问列表中的多个元素时,可以使用切片! 切片操作对列表同样是适用的,语法是列表名[m:n],访问的元素从索引 m 开始到索引 ...

  8. LeetCode 解题报告索引

    最近在准备找工作的算法题,刷刷LeetCode,以下是我的解题报告索引,每一题几乎都有详细的说明,供各位码农参考.根据我自己做的进度持续更新中......                        ...

  9. 寒假LeetCode打卡

    文章目录 @[toc] 链表专题 LeetCode 19. Remove Nth Node From End of List LeetCode 83. Remove Duplicates from S ...

最新文章

  1. Linux C中的basename函数用法示例
  2. 自由自在休闲食品实现奶茶妹的创业梦
  3. androidsdktools安装_如何命令行安装Android SDK Build Tools(构建工具)?
  4. SAP One Order redesign里的WebUI advanced search重构
  5. C# 自定义箭头组件
  6. 程序员求职的六大禁忌,你中招了吗?
  7. HashMap暴力枚举(洛谷P1765题题解,Java语言描述)
  8. 向前、向后、横着走,双足机器人Cassie,靠深度强化学习学会了走路丨论文
  9. 苹果发布2019年上半年透明度报告,收到数万条政府请求
  10. NTFS-3G的安装和配置(Linux下挂载Windows分区必备)
  11. Python实现共现语义网络
  12. 基于Python和MySQL的学生信息管理系统
  13. linux内核不识别分区,ubuntu14.04无法识别树莓派SD卡问题
  14. 打印机计算机故障或繁忙,联想打印机繁忙是怎么回事?
  15. List of music used by Apple Inc.
  16. R-S编码译码-缩短码(10,6)
  17. 客户端访问https时应无浏览器(含终端)安全警告信息;_(多图)老弟,你连HTTPS 原理都不懂,还给我讲“中间人攻击”,逗我吗......
  18. python语言单词_python单词_python 单词_python单词书 - 云+社区 - 腾讯云
  19. 港联证券|基金和股票的区别是什么?谁更适合做短线?
  20. 【期货量化】通过日结算率计算日/月收益率以及利用resample进行时间序列处理

热门文章

  1. 按钮自动居中布局_CSS布局技巧
  2. 未定义与 struct 类型的输入参数相对应的函数 fetch_引入鲁棒性作为连续参数,这种新损失函数实现了自适应、随时变换...
  3. win7计算机个性化设置,笔记本电脑windows7系统如何用好电脑个性化设置
  4. print2flashwindows7旗舰版下载哪一个_JUJUMAO_MSDN原版 win 7 二合一 旗舰版32位 64位原版ISO镜像...
  5. ps图片拖不进去_PS教学:你的logo还不够高大上?7步教做出黄色金属质感logo
  6. 安防监控工程中该如何选择光端机?
  7. [渝粤教育] 广东-国家-开放大学 10763k2_客户服务管理_21秋考试
  8. 【渝粤教育】电大中专新媒体营销实务 (10)作业 题库
  9. 电源模块怎么选?以下6点你都知道吗?
  10. python参数化建模 书_Python 中如何实现参数化测试?