给定一个字符串 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 的攀爬字符串。
对于原字符串great
对第一次 拆分可能有如下几种情况:
1. g
和 reat
2. gr
和 eat
3. gre
和 at
4. grea
和 t
对于 字符串 s2 如果他是great的攀爬字符串 有两种状况:第一种 是与s1相同分割状态 并且,对应分割的子串 也是攀爬字符串,第二种 与 s1 相反分割状态,对应分割的子串 为 攀爬字符串。
class Solution:
# @param {string} s1 A string
# @param {string} s2 Another string
# @return {boolean} whether s2 is a scrambled string of s1
def isScramble(self, s1, s2):
# Write your code here
l = len(s1)
if l == 1:
return s1 == s2
if l == 2:
if s1 == s2:
return True
if s1[0] == s2[1] and s1[1] == s2[0]:
return True
return False
for i in range(1,l):
left1 = s1[0:i]
left2 = s2[0:i]
right1 = s1[i:]
right2 = s2[i:]
left2r = s2[:l-i]
right2r = s2[l-i:]
if (self.isScramble(left1,right2r) and self.isScramble(right1,left2r)) or (self.isScramble(left1,left2) and self.isScramble(right1,right2)):
return True
return False