1. 擾亂字串
使用下面描述的演算法可以擾亂字串 s 得到字串 t :
- 如果字串的長度為 1 ,演算法停止
- 如果字串的長度 > 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]