攀爬字符串

問題

給定一個字符串 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. great
2. great
3. great
4. great
對於 字符串 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 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章