(动态规划递归) leetcode 87. Scramble String

Posted bella2017

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(动态规划递归) leetcode 87. Scramble String相关的知识,希望对你有一定的参考价值。

技术图片

技术图片

思路:用递归来做感觉比动态规划简单,题目让我们判断s1和s2是否是scramble string,则s1上(从左起计数)有一个长度为 i 的分割点将s1分为s1_l 和 s1_r 两段 分别与 s2的(从左起计数一个长度为i的) s2_l 和 s2_r 互为 scramble string;或者与 s2的(从右起计数一个长度为i的)s2.substr(s-i) 和 s2.substr(0, s-i) 互为 scramble string 。

1)C++ 中的 substr(pos, len) 表示从 索引为pos开始的子字符串,截取长度为len的子串,即子串的索引为[pos, pos+len) 注意是左闭右开区间; substr(pos) 表示从索引pos开始到字符串末尾的子字符串,即 [pos, size ) size为字符串长度,注意是左闭右开区间。

2)sort() 可以按字典序排列 string 类型的字符串。

3)== 可以用来判断两个字符串是否相同。

class Solution 
public:
    bool isScramble(string s1, string s2) 
        int s = s2.size(); 
        if(s1.size()!=s2.size())
            return false;
        if(s1==s2)
            return true;
        string str1 = s1, str2 = s2;
        sort(str1.begin(), str1.end());
        sort(str2.begin(), str2.end());
        if(str1 != str2)
            return false;
        for(int i=1; i<s1.size(); ++i)
            string st1_l = s1.substr(0, i), st1_r = s1.substr(i);
            string st2_l = s2.substr(0, i), st2_r = s2.substr(i);
            if((isScramble(st1_l, st2_l) && isScramble(st1_r, st2_r)) || ( isScramble(st1_l, s2.substr(s-i) ) && isScramble(st1_r, s2.substr(0, s-i) ) ))
                return true;
        
        return false;
        
    
;

 

以上是关于(动态规划递归) leetcode 87. Scramble String的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode No.87 扰乱字符串(动态规划)

快速上手leetcode动态规划题

LeetCode 1137 第N个泰波那契数[动态规划 递归] HERODING的LeetCode之路

LeetCode 650 只有两个键的键盘[递归 动态规划] HRRODING的LeetCode之路

LeetCodeLeetCode之跳跃游戏——动态规划+贪心算法

LeetCodeLeetCode之删除并获得点数——动态规划排序+动态规划