在 Python 中檢查是否可以在給定約束條件下從字串 A 形成字串 B
假設我們有兩個字串 s 和 t,以及兩個值 p 和 q。我們必須檢查是否可以從 s 獲取 t,使得 s 被分成 p 個字元一組,除了最後一組最多包含 p 個字元,並且我們可以從每一組中最多選擇 q 個字元,並且 t 中字元的順序必須與 s 相同。
所以,如果輸入類似於 s = "mnonnopeqrst",t = "moprst",p = 5,q = 2,則輸出將為 True,因為我們可以進行如下劃分:"mnonn"、"opeqr"、"st"。現在,透過從 "mnonn" 和 "opeqr" 中分別取 2 個字元的子字串 "mo" 和 "pr",然後 "st" 已經存在,因此使用這兩個長度的子字串,我們可以透過簡單的連線生成 t。
為了解決這個問題,我們將遵循以下步驟:
- temp := 一個空對映,其中所有鍵都包含空列表
- l := 一個大小與 s 長度相同的列表,並用 0 填充
- 對於 i 從 0 到 s 的大小,執行以下操作:
- 將 i 插入到 temp['a'] 的末尾
- low := 0
- 對於 i 從 0 到 t 的大小 - 1,執行以下操作:
- indices := temp['a']
- it := 在 indices 列表中插入 low 的索引,以保持排序順序
- 如果 it 等於 indices 的大小 - 1,則:
- 返回 False
- count := (indices[it] / p) 的商
- l[count] := l[count] + 1
- 如果 l[count] >= q,則:
- count := count + 1
- low := count * p
- 否則:
- low := indices[it] + 1
- 返回 True
示例
讓我們看一下以下實現,以便更好地理解:
from bisect import bisect_left from collections import defaultdict def solve(s, t, b, m) : temp = defaultdict(list) l = [0] * len(s) for i in range(len(s)) : temp['a'].append(i) low = 0 for i in range(len(t)) : indices = temp['a'] it = bisect_left(indices, low) if it == len(indices) : return False count = indices[it] // b l[count] = l[count] + 1 if l[count] >= m : count += 1 low = count * b else : low = indices[it] + 1 return True s = "mnonnopeqrst" t = "moprst" p = 5 q = 2 print (solve(s, t, p, q))
輸入
"mnonnopeqrst", "moprst", 5, 2
輸出
True
廣告