สมมติว่าเรามีสตริงตัวเลข s อย่างที่เราทราบดีว่าสตริงย่อยที่ยอดเยี่ยมคือสตริงย่อยที่ไม่ว่างเปล่าของ s ซึ่งเราสามารถทำการสลับจำนวนเท่าใดก็ได้เพื่อทำให้มันเป็นพาลินโดรม เราต้องหาความยาวของความยาวสูงสุดของสตริงย่อยที่น่ากลัวของ s
ดังนั้น หากอินพุตเป็นเหมือน s ="4353526" ผลลัพธ์จะเป็น 5 เพราะ "35352" เป็นสตริงย่อยที่ยาวที่สุด เราสามารถสร้าง "35253" palindrome ได้
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
น :=0
-
pos_map :=แผนที่ที่มีคีย์ 0 และค่าที่สอดคล้องกันคือขนาดของ s
-
max_len :=1
-
สำหรับฉันในช่วงขนาด s - 1 ถึง 0, ลดลง 1 ทำ
-
n :=n XOR (2^s[i])
-
ถ้า n มีอยู่ใน pos_map แล้ว
-
max_len :=สูงสุดของ max_len และ pos_map[n]-i
-
-
สำหรับ j ในช่วง 0 ถึง 9 ทำ
-
m :=n XOR 2^j
-
ถ้า m อยู่ใน pos_map แล้ว
-
max_len :=สูงสุดของ max_len และ pos_map[m]-i
-
-
-
ถ้าไม่ได้อยู่ใน pos_map แล้ว
-
pos_map[n] :=ผม
-
-
-
ส่งคืน max_len
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น
def solve(s): n = 0 pos_map = {0:len(s)} max_len = 1 for i in range(len(s)-1, -1, -1): n = n ^ (1 << int(s[i])) if n in pos_map: max_len = max(max_len, pos_map[n]-i) for j in range(10): m = n ^ (1 << j) if m in pos_map: max_len = max(max_len, pos_map[m]-i) if n not in pos_map: pos_map[n] = i return max_len s = "4353526" print(solve(s))
อินพุต
"4353526"
ผลลัพธ์
5