动态规划——scramble-string

来源:互联网 发布:mac子弹头色号 编辑:程序博客网 时间:2024/05/19 04:26

题目来源:http://www.cnblogs.com/easonliu/p/3696135.html

题目描述


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.



分析:
这个问题是google的面试题。由于一个字符串有很多种二叉表示法,貌似很难判断两个字符串是否可以做这样的变换。
对付复杂问题的方法是从简单的特例来思考,从而找出规律。
先考察简单情况:
字符串长度为1:很明显,两个字符串必须完全相同才可以。
字符串长度为2:当s1="ab", s2只有"ab"或者"ba"才可以。
对于任意长度的字符串,我们可以把字符串s1分为a1,b1两个部分,s2分为a2,b2两个部分,满足((a1~a2) && (b1~b2))或者 ((a1~b2) && (a1~b2))

如此,我们找到了解决问题的思路。首先我们尝试用递归来写。

解法一(递归):
两个字符串的相似的必备条件是含有相同的字符集。简单的做法是把两个字符串的字符排序后,然后比较是否相同。
加上这个检查就可以大大的减少递归次数。

import java.util.*;public class Solution {    public boolean isScramble(String s1, String s2) {        if(s1 == null||s2 == null||s1.length()!=s2.length())            return false;        if(s1.length() == 1&&s1.charAt(0) == s2.charAt(0))            return true;        char[] ch1=s1.toCharArray();        char[] ch2=s2.toCharArray();        Arrays.sort(ch1);        Arrays.sort(ch2);        if(String.valueOf(ch1).equals(String.valueOf(ch2)) == false)            return false;            for(int i=1;i<s1.length();i++)                {                String s11=s1.substring(0,i);                String s12=s1.substring(i);                String s21=s2.substring(0,i);                String s22=s2.substring(i);                if(isScramble(s11,s21)&&isScramble(s12,s22))                    return true;                s21=s2.substring(0,s2.length()-i);                s22=s2.substring(s2.length()-i);                if(isScramble(s11,s22)&&isScramble(s12,s21))                    return true;            }        return false;    }}




0 0
原创粉丝点击