สมมติว่าเราต้องการสร้างสตริงเป้าหมายของตัวพิมพ์เล็ก ในตอนแรก เรามีลำดับเป็น n '?' เครื่องหมาย (n คือความยาวของสตริงเป้าหมาย) นอกจากนี้เรายังมีตราประทับของตัวพิมพ์เล็ก ในแต่ละรอบ เราสามารถวางตราประทับไว้เหนือลำดับ และแทนที่ตัวอักษรทุกตัวใน the ด้วยจดหมายที่เกี่ยวข้องจากตราประทับนั้น คุณสามารถทำได้ถึง 10 * n รอบ
ตัวอย่างเช่น ให้พิจารณาลำดับเริ่มต้นคือ "?????" และตราประทับคือ "abc" จากนั้นเราอาจสร้างสตริงเช่น "abc?", "?abc?", "??abc" ในลำดับแรก เปลี่ยน. หากลำดับนั้นสามารถประทับตราได้ ให้ส่งคืนอาร์เรย์ของดัชนีด้วยตัวอักษรซ้ายสุดที่ประทับในแต่ละตาแหน่ง หากไม่สามารถทำได้ ให้ส่งคืนอาร์เรย์ว่าง ดังนั้นเมื่อลำดับคือ "ababc" และ thestamp คือ "abc" คำตอบก็เหมือนกับ [0, 2] เพราะเราสามารถสร้างแบบ "?????" -> "เอบีซี?? -> "เอบีซี".
ดังนั้น หากอินพุตเป็น s ="abcd" t ="abcdbcd" ผลลัพธ์จะเป็น [3,0]
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
ถ้าขนาดเท่ากับ 1 แล้ว
-
ส่งคืนรายการจาก 0 เป็น t เมื่ออักขระทั้งหมดใน t เหมือนกันและเป็น s[0] มิฉะนั้นจะเป็นรายการว่างใหม่
-
-
ans :=รายการใหม่
-
ในขณะที่ t ไม่เหมือนกับขนาดของ t จำนวน "?" เครื่องหมาย ทำ
-
tmp :=t
-
สำหรับฉันในช่วง 0 ถึงขนาด s ทำ
-
สำหรับ j ในขนาด s เหลือ i+1:
-
ค้นหา :=ฉันหมายเลขของ "?" เชื่อมสตริงย่อยของ s[จากดัชนี i ถึง j-1] ต่อกัน (ขนาดของ s - j) จำนวน "?"
-
ในขณะที่การค้นหาอยู่ใน t ให้ทำ
-
แทรกที่มีการค้นหาอยู่ใน t ที่ส่วนท้ายของ ans
-
t :=แทนที่การค้นหาด้วยขนาดของ s จำนวน "?" เพียงครั้งเดียว
-
-
ถ้า t เท่ากับขนาดของ t จำนวน "?" แล้ว
-
ออกจากวง
-
-
ถ้า t เท่ากับขนาดของ t จำนวน "?" แล้ว
-
ออกจากวง
-
-
-
ถ้า tmp เหมือนกับ t แล้ว
-
ออกจากวง
-
-
-
-
ย้อนกลับของ ans.
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น
def solve(s, t): if len(s) == 1: return [i for i in range(len(t))] if all(t==s[0] for t in t)else [] ans = [] while t != "?" * len(t): tmp = t for i in range(len(s)): for j in reversed(range(i+1, len(s)+1)): search = "?" * i + s[i:j] + "?" * (len(s)-j) while t.find(search) != -1: ans.append(t.find(search)) t = t.replace(search, "?"*len(s), 1) if t == "?" * len(t): break if t == "?" * len(t): break if tmp == t: return [] return ans[::-1] s = "abcd" t = "abcdbcd" print(solve(s, t))
อินพุต
"abcd", "abcdbcd"
ผลลัพธ์
[3,0]