• [LeetCode] Scramble String 解题报告


    Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrings recursively.
    Below is one possible representation of s1 = "great":
        great
    / \
    gr eat
    / \ / \
    g r e at
    / \
    a t
    To scramble the string, we may choose any non-leaf node and swap its two children.
    For example, if we choose the node "gr" and swap its two children, it produces a scrambled string "rgeat".
        rgeat
    / \
    rg eat
    / \ / \
    r g e at
    / \
    a t
    We say that "rgeat" is a scrambled string of "great".
    Similarly, if we continue to swap the children of nodes "eat" and "at", it produces a scrambled string "rgtae".
        rgtae
    / \
    rg tae
    / \ / \
    r g ta e
    / \
    t a
    We say that "rgtae" is a scrambled string of "great".
    Given two strings s1 and s2 of the same length, determine if s2 is a scrambled string of s1.
    » Solve this problem

    [解题思路]
    首先想到的是递归,简单明了,对两个string进行partition,然后比较四个字符串段。但是递归的话,这个时间复杂度比较高。然后想到能否DP,但是即使用DP的话,也要O(n^3)。想想算了,还是在递归里做些剪枝,这样就可以避免冗余计算:
    • 对于每两个要比较的partition,统计他们字符出现次数,如果不相等返回。
     上网搜了一下,有人说可以O(n)做出来。http://www.mitbbs.com/article_t/JobHunting/32114513.html
    但是我没办法证明他这个算法的正确性。感觉这道题应该有O(n)的解法,一时想不出来。

    1:       bool isScramble(string s1, string s2) {   
    2: // Start typing your C/C++ solution below
    3: // DO NOT write int main() function
    4: if(s1.size() != s2.size()) return false;
    5: int A[26];
    6: memset(A,0,26*sizeof(A[0]));
    7: for(int i =0;i<s1.size(); i++)
    8: {
    9: A[s1[i]-'a']++;
    10: }
    11: for(int i =0;i<s2.size(); i++)
    12: {
    13: A[s2[i]-'a']--;
    14: }
    15: for(int i =0;i<26; i++)
    16: {
    17: if(A[i] !=0)
    18: return false;
    19: }
    20: if(s1.size() ==1 && s2.size() ==1) return true;
    21: for(int i =1; i< s1.size(); i++)
    22: {
    23: bool result= isScramble(s1.substr(0, i), s2.substr(0, i))
    24: && isScramble(s1.substr(i, s1.size()-i), s2.substr(i, s1.size()-i));
    25: result = result || (isScramble(s1.substr(0, i), s2.substr(s2.size() - i, i))
    26: && isScramble(s1.substr(i, s1.size()-i), s2.substr(0, s1.size()-i)));
    27: if(result) return true;
    28: }
    29: return false;
    30: }

  • 相关阅读:
    详解实现Android中实现View滑动的几种方式
    一起写一个Android图片轮播控件
    Java核心技术点之多线程
    深入了解整数在计算机内部的表示
    Java核心技术点之接口
    Java核心技术点之内部类
    配置resin web方式部署项目
    rsa加密算法,前后端实现。
    引用百度bcebos jar 503问题
    HashMap get()返回值问题
  • 原文地址:https://www.cnblogs.com/codingtmd/p/5078959.html
Copyright © 2020-2023  润新知