สมมติว่าเรามีสตริง 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