`
bcyy
  • 浏览: 1830852 次
文章分类
社区版块
存档分类
最新评论

Scramble String -- LeetCode

 
阅读更多
原题链接: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高手还是不在话下的哈。
分享到:
评论

相关推荐

    Blender-Scramble-Addon-源码.rar

    Blender-Scramble-Addon-源码.rar

    Word-Scramble---Guess-The-Word

    单词争夺:猜词JavaScript数组-随机化数组内容元素选择和DOM... randomArray(scramble.split(“”))。join(“”); Math.floor(Math.random()* myArray.length); for(让i = arr.length-1; i&gt; 0; i--){图片

    usb3.0-scramble-calculator-express

    本表格通过逐bit运算解释了usb3.0使用的scrambler多项式的实现过程,易于新手学习与理解。

    Python库 | cube scramble cli-0.4.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:cube scramble cli-0.4.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    Scramble!-开源

    “扰乱您的社交网络数据!” -使用Scramble,您可以有选择地强制您对社交网络(如Facebook或Twitter)上的内容执行访问控制首选项...

    Scramble2-开源

    Xchat的New Scramble游戏。 Xchat的一个简单项目。

    ScrambleJS:JavaScript中数组和字符串的有效改组

    ScrambleJS JavaScript中数组和字符串的有效改组在做了ScrambleJS可作为Node模块使用$ npm install scramble --save 以及凉亭组件$ bower install scramble --save 或者可以直接在此仓库中设置$ git clone git@...

    争夺「Scramble」-crx插件

    在Elingsh工会会上,一位主持人致辞,说这不是在一个杂乱无章的地方,在olny iprmoetnt tihng是在第一个,而lsat ltteer在在rghit上。 该rset可以是toatl mses,您可以将其设置为wathit porbelm。...

    libapache2-mod-scramble-ip-开源

    libapache2-mod-scramble-ip以某种方式对apache服务器中的IP进行加密,您仍然可以使用它们(用于分析等),但是无法找到原始IP。

    Persona-5-Strikers-Scramble-Save-Editor:使用Python的《女神异闻录5》贴纸和加注保存编辑器

    Persona-5-Strikers-Scramble-Save-Editor 使用Python的《女神异闻录5》贴纸和加注保存编辑器 与保存插槽1到9一起使用 特征 更换名字 钱 角色点 债券 武器类 护甲 配件 消耗品 菜谱 现金垫。 技能卡 角色

    Scramble-Generator-v1:提供所有 WCA 争夺战

    Scrambler-Generator-v1 提供所有 WCA 争夺战

    scramble-server:一个用于生成多维数据集的争夺和图像的http服务器

    docker run -it --rm -p 12014:12014 -m 100M --cpus=2 lz1998/scramble-server:0.0.1 用法 Usage: /scramble/ /view/&lt;TYPE&gt;?scramble=&lt;SCRAMBLE&gt;&format= TYPE: 101010, 111111, 121212, 131313, 141414, 151515, ...

    Slimy-Scramble-:2-d Snake 游戏,字母混杂形成有效单词

    Slimy Scramble 是诺基亚贪吃蛇游戏的变种。 在这里,玩家必须使用蛇来解读混乱的字母以形成一个单词。 这个想法很简单,但玩家必须玩好蛇游戏并同时找出单词。 怎么玩: 最初,蛇只有头。 选择正确的字母后,其...

    Jumble-Scramble-Word-Game:混杂游戏,可从文本文件中猜测生成的混杂词

    混乱争夺文字游戏 混杂游戏,可从文本文件中猜测生成的混杂词

    Scramble-crx插件

    语言:English (United States) 只需单击一个按钮,即可使每个网页变得有趣。 在Elingsh工会会上,一位主持人致辞,说这不是在一个杂乱无章的地方,在olny iprmoetnt tihng是在第一个,而lsat ltteer在在rghit上。...

    tetris-scramble-client

    俄罗斯方块争夺服务器 所需的一次性操作: 如果尚未安装PostgresDB(和pgadmin)。 确保可以在cmd或任何其他CLI中运行psql命令。 如果需要,创建自己的用户和...CREATE DATABASE tetris_scramble_dev; Done. Go b

    Blender-Scramble-Addon

    搅拌机加扰 这是一个附加功能,可能会融合到Blender发痒的部分。 扩展Blender并具有大量有用功能的附加组件 下载 安装 从下面的链接下载您喜欢的加载项版本 设置&gt;附件&gt;单击“安装...”按钮以zip文件形式安装附件。...

    react-scramble:用于文本加扰动画的React组件

    import Scramble from 'react-scramble' class App extends React . Compoent { render ( ) { return ( &lt; Scramble autoStart text = "Scramble me!" steps = { [ { roll : 10 , action : '+' , type :...

    scramble-case:Scramble Macropad的亚克力盒

    争夺案Scramble Macropad的亚克力盒每层都应使用3mm丙烯酸酯进行切割。 尺寸:72x53mm档案资讯L0:底层L1:USB切口层L2:USB切口层L3:PCB安装层L4:顶层1 L5:顶层2所需硬件12个M2x8mm螺钉4个M2垫圈4个M2螺栓4x M2...

    前端开源库-email-scramble

    前端开源库-email-scramble电子邮件混乱,电子邮件地址和电话号码混乱与rot-18,以隐藏他们的僵尸。

Global site tag (gtag.js) - Google Analytics