题目描述
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;