สมมติว่ามีสตริง s ที่ประกอบด้วยตัวอักษรภาษาอังกฤษพิมพ์เล็ก และอักขระพิเศษ เช่น [, |, และ ] โดยรูปแบบ [a|b|c] หมายถึงสามารถเลือกได้เพียงหนึ่งใน a, b, หรือ c เท่านั้น เราต้องการหารายการสตริงทั้งหมดที่ s สามารถแทนได้ โดย [] ไม่สามารถซ้อนกันได้ และอาจมีตัวเลือกได้ไม่จำกัดจำนวน
ตัวอย่างเช่น หากอินพุตคือ s = "[d|t|l]im[e|s]" ผลลัพธ์จะเป็น ['dime', 'dims', 'lime', 'lims', 'time', 'tims']
ขั้นตอนการแก้ปัญหา
- ถ้า
sว่าง ให้คืนค่ารายการที่มีสตริงว่าง - กำหนด
n= ความยาวของs - สร้างรายการ
seqและresว่างๆ - สร้างฟังก์ชัน
helper(pos)ที่รับตำแหน่งปัจจุบัน:- ถ้า
pos == nให้รวมสมาชิกในseqและเพิ่มลงในres - มิฉะนั้น:
- ถ้ามี
[ในs[pos:]:- หาตำแหน่ง
startและendของวงเล็บ - วนลูปแต่ละตัวเลือกใน
s[start+1:end]ที่แบ่งด้วย|:- เพิ่ม
s[pos:start]และตัวเลือกเข้าseq - เรียก
helper(end + 1) - ลบ 2 ตัวสุดท้ายออกจาก
seq(backtrack)
- เพิ่ม
- หาตำแหน่ง
- มิฉะนั้น (ไม่มีวงเล็บเหลือ):
- เพิ่ม
s[pos:]เข้าseq - เรียก
helper(n) - ลบตัวสุดท้ายออกจาก
seq
- เพิ่ม
- ถ้ามี
- ถ้า
- จากเมธอดหลัก เรียก
helper(0)แล้วคืนค่าresที่เรียงลำดับแล้ว
ตัวอย่างโค้ด
class Solution:
def solve(self, s):
if not s:
return [""]
n = len(s)
seq = []
res = []
def helper(pos):
if pos == n:
res.append("".join(seq))
else:
if "[" in s[pos:]:
start = pos + s[pos:].index("[")
end = pos + s[pos:].index("]")
for option in s[start + 1:end].split("|"):
seq.append(s[pos:start])
seq.append(option)
helper(end + 1)
seq.pop()
seq.pop()
else:
seq.append(s[pos:])
helper(n)
seq.pop()
helper(0)
return sorted(res)
ob = Solution()
s = "[d|t|l]im[e|s]"
print(ob.solve(s))
อินพุต
"[d|t|l]im[e|s]"
เอาต์พุต
['dime', 'dims', 'lime', 'lims', 'time', 'tims']