13.7 Scramble String

来源:互联网 发布:销售奖励政策 知乎 编辑:程序博客网 时间:2024/05/22 01:53

Link: https://oj.leetcode.com/problems/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.

My thought: no idea. 

Approach: 3D-DP. Time: O(n^4), Space: O(n^3)

Refer: Dai's code 

public class Solution {    public boolean isScramble(String s1, String s2) {        if(s1== null || s2 == null ||s1.length()!=s2.length()) return false;        if(s1.length() == 0) return true;        int n = s1.length();        //since the 3rd dimension is the length of         boolean[][][] result = new boolean[n][n][n+1];        //init: two single chars are scrambled        for(int i = 0; i < n; i++){            for(int j = 0; j < n; j++){                result[i][j][1] = s1.charAt(i) == s2.charAt(j);            }        }        for(int len = 2; len <=n; len++){            for(int i = 0; i+len<= n; i++){//note: i+len<=n, not i<=n                for(int j = 0; j+len<= n; j++){//note: j+len<=n, not j<=n                    for(int k = 1; k < len; k++){//why not k = [0,len]?                        result[i][j][len] = (result[i][j][k] && result[i+k][j+k][len-k])                                        || (result[i][j+len-k][k] && result[i+k][j][len-k]);                        if(result[i][j][len] == true) break;                    }                }            }        }       return result[0][0][n];    }}


0 0
原创粉丝点击