攀爬字符串

问题

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