q294402756 于 2015.07.20 14:44 提问

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.

`````` public class Solution {
/**
* @param s1 A string
* @param s2 Another string
* @return whether s2 is a scrambled string of s1
*/
public boolean isScramble(String s1, String s2) {
int n = s1.length();
if (s2.length() != n)
return false;

boolean dp[][][] = new boolean[n][n][n];

// case: length is 1
for (int i=0; i<n; i++)
for (int j=0; j<n; j++)
dp[i][j][0] = s1.charAt(i) == s2.charAt(j);

// case: length is 2....n
for (int l=1; l<n; l++)
{
for (int i=0; i+l<n; i++)
{
for (int j=0; j+l<n; j++)
{
for (int k=0; k<l; k++)
{
if ((dp[i][j][k] && dp[i+k+1][j+k+1][l-1-k])
|| (dp[i][j+l-k][k] && dp[i+k+1][j][l-1-k]))
dp[i][j][l] = true;
}
}
}
}

return dp[0][0][n-1];
}

}

``````

1个回答

CSDNXIAOD   2015.07.20 14:49

LeetCode: Scramble String
[LeetCode]Scramble String
[LeetCode]Scramble String
----------------------biu~biu~biu~~~在下问答机器人小D，这是我依靠自己的聪明才智给出的答案，如果不正确，你来咬我啊！