[Leetcode] Scramble String (Java)

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.

根据以上规则,找出是否两个字符串s1,s2能变换得到:

还是想到DFS

为了简单剪枝,进行了质数乘法的字符组合判断:

判断的时候对s1,s2拆分,若s1能变换成s2,则满足其中一个条件:

1)s1的前i位可以和s2的前i位变换,s1的后length-i位可以和s2的后length-i位变换;

2)s1的前i位可以和s2的后i位变换,s1的后length-i位可以和s2的length-i位变换。

public class Solution {
    private static final int[] albet={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101};
	public boolean isScramble(String s1, String s2) {
		if(s1.equals(s2))
			return true;
		for(int i=1;i<s1.length();i++){
			boolean flag = false;
			if(isEqual(s1.substring(0,i).toCharArray(),s2.substring(0,i).toCharArray())){
				flag=isScramble(s1.substring(0,i), s2.substring(0,i))&&isScramble(s1.substring(i), s2.substring(i));
			}
			if(flag)
				return true;
			if(isEqual(s1.substring(0,i).toCharArray(),s2.substring(s2.length()-i).toCharArray())){
				flag=isScramble(s1.substring(0,i), s2.substring(s2.length()-i))&&isScramble(s1.substring(i), s2.substring(0,s2.length()-i));
			}
			if(flag)
				return true;
		}
		return false;
	}
	public boolean isEqual(char[] a, char[] b){
		long sum_a=1L,sum_b=1L;
		for(int i=0;i<a.length;i++){
			sum_a*=albet[a[i]-'a'];
		}
		for(int i=0;i<b.length;i++){
			sum_b*=albet[b[i]-'a'];
		}
		return sum_a==sum_b;
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值