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.

思路:1、对于该问题,首先明白是在判断字符串S2是否为S1的scrambled string,分情况讨论的话,可以刚开始先看是否equals,这样可以判断长度为一的字符串;

2、接下来可以判断字符串的长度是否相同;

3、之后判断是否出现的字符相同,这里新建了一个长度为26的数组,要习惯这种思路,在前面的题中,找出现次数为n的数组中只是出现一次的数字也将32位的值分别存在了长度为32的数组里;

4、对递归的使用,分两种,一种是没有进行左右转换,一种是进行了左右转换;

public class Solution {
   public boolean isScramble(String s1, String s2) {
        if (s1.equals(s2))
            return true;
  
        int[] letters = new int[26];
        for (int i = 0; i < s1.length(); i++) {
            letters[s1.charAt(i) - 'a']++;
            letters[s2.charAt(i) - 'a']--;
        }
        for (int i = 0; i < 26; i++)
            if (letters[i] != 0)
                return false;
  
        for (int i = 1; i < s1.length(); i++) {
            //当前分割出没有交换
            if (isScramble(s1.substring(0, i), s2.substring(0, i))
                    && isScramble(s1.substring(i), s2.substring(i)))  //因为该函数是返回值为布尔型的,所以可以把其放在条件里面
                return true;
            //当前分割出交换---左右交换,这两段可以合在一起,但是可读性比较差
            if (isScramble(s1.substring(0, i), s2.substring(s2.length() - i))
                    && isScramble(s1.substring(i), s2.substring(0, s2.length() - i)))
                return true;
        }
        return false;

猜你喜欢

转载自blog.csdn.net/weixin_30363263/article/details/80271134