สมมติว่าเรามีสตริง เราต้องหาจำนวนสูงสุดของสตริงย่อยเฉพาะที่สามารถแยกสตริงที่กำหนดได้ เราสามารถแยกสตริงออกเป็นรายการของสตริงย่อยที่ไม่ว่างเปล่า เพื่อให้การต่อกันของสตริงย่อยเป็นสตริงดั้งเดิม แต่เราต้องแยกสตริงย่อยออกเพื่อให้ทั้งหมดเหมือนกัน
ดังนั้น หากอินพุตเป็น s ="pqpqrrr" ผลลัพธ์จะเป็น 5 เพราะเราสามารถแยกออกเป็น ['p', 'q', 'pq', 'r', 'rr'] ถ้าเราแยกเช่น ['p', 'q', 'p', 'q', 'r', 'rr'] ไม่ถูกต้องเพราะที่นี่ 'p' และ 'q' ปรากฏหลายครั้ง
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- res :=รายการที่มีองค์ประกอบเดียว 0
- กำหนดฟังก์ชัน dfs() นี่จะใช้เวลา s, เส้นทางซึ่งเป็นชุดว่างใหม่
- ถ้า s ว่าง ก็
- res[0] :=สูงสุดของ res[0] และขนาดของเส้นทาง
- คืนสินค้า
- สำหรับฉันในช่วง 1 ถึงขนาด s ทำ
- x :=subarray ของ s[จากดัชนี 0 ถึง i-1]
- ถ้า x ไม่อยู่ในเส้นทางแล้ว
- dfs(สตริงย่อยของ s[จากดัชนี i ถึง end], เส้นทาง U {x})
- จากวิธีหลัก ให้ทำดังนี้ -
- dfs
- ผลตอบแทน[0]
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
def solve(s): res = [0] def dfs(s, path=set()): if not s: res[0] = max(res[0], len(path)) return for i in range(1, len(s)+1): x = s[:i] if x not in path: dfs(s[i:], path|{x}) dfs(s) return res[0] s = "pqpqrrr" print(solve(s))
อินพุต
"pqpqrrr"
ผลลัพธ์
5