Study Plan For Algorithms - Part44

WindMay發表於2024-09-28

1. 擾亂字串
使用下面描述的演算法可以擾亂字串 s 得到字串 t :

  1. 如果字串的長度為 1 ,演算法停止
  2. 如果字串的長度 > 1 ,執行下述步驟:
  • 在一個隨機下標處將字串分割成兩個非空的子字串。即,如果已知字串 s ,則可以將其分成兩個子字串 x 和 y ,且滿足 s = x + y 。
  • 隨機 決定是要「交換兩個子字串」還是要「保持這兩個子字串的順序不變」。即,在執行這一步驟之後,s 可能是 s = x + y 或者 s = y + x 。
  • 在 x 和 y 這兩個子字串上繼續從步驟 1 開始遞迴執行此演算法。

給定兩個 長度相等 的字串 s1 和 s2,判斷 s2 是否是 s1 的擾亂字串。如果是,返回 true ;否則,返回 false 。

class Solution:
    def isScramble(self, s1: str, s2: str) -> bool:
        if len(s1)!= len(s2):
            return False
        if s1 == s2:
            return True
        n = len(s1)
        dp = [[[False for _ in range(n + 1)] for _ in range(n)] for _ in range(n)]
        for i in range(n):
            for j in range(n):
                dp[i][j][1] = (s1[i] == s2[j])
        for l in range(2, n + 1):
            for i in range(n - l + 1):
                for j in range(n - l + 1):
                    for k in range(1, l):
                        if (dp[i][j][k] and dp[i + k][j + k][l - k]) or (dp[i][j + l - k][k] and dp[i + k][j][l - k]):
                            dp[i][j][l] = True
        return dp[0][0][n]

2. 合併兩個有序陣列
給定兩個按 非遞減順序 排列的整數陣列 nums1 和 nums2,另有兩個整數 m 和 n ,分別表示 nums1 和 nums2 中的元素數目。

請合併 nums2 到 nums1 中,使合併後的陣列同樣按 非遞減順序 排列。

注意:最終,合併後陣列不應由函式返回,而是儲存在陣列 nums1 中。為了應對這種情況,nums1 的初始長度為 m + n,其中前 m 個元素表示應合併的元素,後 n 個元素為 0 ,應忽略。nums2 的長度為 n 。

class Solution:
    def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
        """
        Do not return anything, modify nums1 in-place instead.
        """
        p1 = m - 1
        p2 = n - 1
        p = m + n - 1

        while p1 >= 0 and p2 >= 0:
            if nums1[p1] > nums2[p2]:
                nums1[p] = nums1[p1]
                p1 -= 1
            else:
                nums1[p] = nums2[p2]
                p2 -= 1
            p -= 1

        nums1[:p2 + 1] = nums2[:p2 + 1]

相關文章