สมมติว่าเรามีสตริง 24 ชั่วโมงในรูปแบบ "hh:mm" เราต้องหาเวลาที่ใกล้เคียงที่สุดถัดไปที่สามารถสร้างได้โดยใช้ตัวเลขที่กำหนดซ้ำ เราสามารถนำตัวเลขจากสตริงที่กำหนดมาใช้ซ้ำได้หลายครั้งตามต้องการ
ดังนั้น หากอินพุตเป็น s ="03:15" เอาต์พุตจะเป็น 03:30 น. ซึ่งเป็นเวลาที่ใกล้ที่สุด 03:30 น. ซึ่งจะซ้ำกับตัวเลขที่ระบุ
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้:
- use :=รายการที่มีค่าชั่วโมงสองหลักและนาทีสองหลัก
- เป็นไปได้ :=ชุดใหม่
- กำหนดฟังก์ชัน backtrack() นี่จะเป็นเส้นทาง
- ถ้าขนาดของเส้นทางเท่ากับ 4 แล้ว
- (เส้นทาง[สองหลักแรก] ต่อกัน ":" เชื่อมเส้นทาง[สองหลักสุดท้าย]) และแทรกลงในความเป็นไปได้
- คืนสินค้า
- สำหรับแต่ละ p ที่ใช้งาน ทำ
- ถ้า (ขนาดของพาธเท่ากับ 0 และ p>
"2") เป็นเท็จ และ (พาธเหมือนกับ "2" และ p>
"3") เป็นเท็จ และ (ขนาดของพาธเท่ากับ 2 และ p>
"5") เป็นเท็จ ดังนั้น
- ย้อนกลับ(เส้นทาง + p)
- ถ้า (ขนาดของพาธเท่ากับ 0 และ p>
"2") เป็นเท็จ และ (พาธเหมือนกับ "2" และ p>
"3") เป็นเท็จ และ (ขนาดของพาธเท่ากับ 2 และ p>
"5") เป็นเท็จ ดังนั้น
- จากวิธีหลัก ให้ทำดังนี้:
- ย้อนรอย(สตริงว่าง)
- เป็นไปได้ :=รายการใหม่จากที่เป็นไปได้
- เรียงลำดับรายการได้
- สำหรับ i ในช่วง 0 ถึงขนาดที่เป็นไปได้ - 2 ทำ
- ถ้าเป็นไปได้[i] ก็เหมือนกับ s แล้ว
- คืนได้[i + 1]
- ถ้าเป็นไปได้[i] ก็เหมือนกับ s แล้ว
- คืนได้[0]
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น:
ตัวอย่าง
class Solution: def solve(self, s): use = [s[0], s[1], s[3], s[4]] possible = set() def backtrack(path): nonlocal possible, use if len(path) == 4: possible.add(path[:2] + ":" + path[2:]) return for p in use: if (not (len(path) == 0 and p > "2") and not (path == "2" and p > "3") and not (len(path) == 2 and p > "5")): backtrack(path + p) backtrack("") possible = list(possible) possible.sort() for i in range(len(possible) - 1): if possible[i] == s: return possible[i + 1] return possible[0] ob = Solution() s = "03:15" print(ob.solve(s))
อินพุต
"03:15"
ผลลัพธ์
03:30