問題
給定一個字符串 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