LeetCode87-scramble-string

题目描述

题目给出一个字符串s1,我们可以用递归的方法将字符串分成两个非空的子串来将s1表示成一个二叉树
下面是s1=“great”的一种二叉树的表现形式:
great↵ / ↵ gr eat↵ / / ↵g r e at↵ / ↵ a t
将字符串乱序的方法是:选择任意的非叶子节点,交换它的两个孩子节点。
例如:如果我们选择节点“gr”交换他的两个孩子节点,就会产生一个乱序字符串"rgeat".
rgeat↵ / ↵ rg eat↵ / / ↵r g e at↵ / ↵ a t
我们称"rgeat"是"great"的一个乱序字符串。
类似的:如果我们继续交换“eat”的两个孩子节点和“at”的两个孩子节点,会产生乱序字符串"rgtae".
rgtae↵ / ↵ rg tae↵ / / ↵r g ta e↵ / ↵ t a
我们称"rgtae"是"great"的一个乱序字符串。
给出两个长度相同的字符串s1 和 s2,请判断s2是否是s1的乱序字符串。

java 代码

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.equals(s2)){
            return true;
        }
        char [] ch1 = s1.toCharArray();
        char [] ch2 = s2.toCharArray();
        Arrays.sort(ch1);
        Arrays.sort(ch2);
        String str1 = new String(ch1);
        String str2 = new String(ch2);
        if(!str1.equals(str2)){
            return false;
        }
        
        for(int i =1;i <s1.length();i++){
            String s1Left = s1.substring(0,i);
            String s1Right = s1.substring(i,s1.length()); 
            if( (isScramble(s1Left,s2.substring(0,i)) && isScramble(s1Right,s2.substring(i,s2.length())))||
              (isScramble(s1Left,s2.substring(s2.length()-i,s2.length())) && isScramble(s1Right,s2.substring(0,s2.length()-i)))){
                return true;
            }
        }        
        return false;       
    }
}
发布了84 篇原创文章 · 获赞 0 · 访问量 1028

猜你喜欢

转载自blog.csdn.net/weixin_40300702/article/details/105597457
今日推荐