สมมติว่าเรามีสตริงที่มีอักขระ ASCII ตัวพิมพ์เล็ก เราจะต้องค้นหาสตริงย่อยพาลินโดรมที่ต่อเนื่องกันที่ชัดเจนทั้งหมด
ดังนั้น หากอินพุตเป็นเหมือน "bddaaa" ผลลัพธ์จะเป็น [a, aa, aaa, b, d, dd]
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- m :=แผนที่ใหม่
- n :=ขนาดของ s
- เมทริกซ์ :=สร้างสองแถวของ n จำนวน 0s
- s :="@" concatenate s concatenate "#"
- สำหรับ j ในช่วง 0 ถึง 1 ให้ทำ
- อุณหภูมิ :=0
- เมทริกซ์[j, 0] :=0
- ผม :=1
- ในขณะที่ฉัน <=n ทำ
- ในขณะที่ s[i - temp - 1] เหมือนกับ s[i + j + temp] ให้ทำ
- อุณหภูมิ :=อุณหภูมิ + 1
- เมทริกซ์[j, i] :=อุณหภูมิ
- k :=1
- ในขณะที่ (เมทริกซ์[j, i - k] ไม่เหมือนกับ temp - k) และ k
- เมทริกซ์[j,i+k] :=ขั้นต่ำของเมทริกซ์[j, i-k]
- k :=k + 1
- ในขณะที่ s[i - temp - 1] เหมือนกับ s[i + j + temp] ให้ทำ
- อุณหภูมิ :=สูงสุดของอุณหภูมิ - k, 0
- ผม :=ผม + k
- สำหรับ j ในช่วง 0 ถึง 1 ให้ทำ
- สำหรับอุณหภูมิในช่วง ทำ
- m[สตริงย่อยของ s จาก (i - temp - 1) ถึง (i - temp - 1 + 2 * temp + j)] =1
-
- สำหรับอุณหภูมิในช่วง ทำ
- m[s[i]] :=1
- จอแสดงผล
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
def find_substr(s): m = dict() n = len(s) matrix = [[0 for x in range(n+1)] for x in range(2)] s = "@" + s + "#" for j in range(2): temp = 0 matrix[j][0] = 0 i = 1 while i <= n: while s[i - temp - 1] == s[i + j + temp]: temp += 1 matrix[j][i] = temp k = 1 while (matrix[j][i - k] != temp - k) and (k < temp): matrix[j][i+k] = min(matrix[j][i-k], temp - k) k += 1 temp = max(temp - k, 0) i += k s = s[1:len(s)-1] m[s[0]] = 1 for i in range(1,n): for j in range(2): for temp in range(matrix[j][i],0,-1): m[s[i - temp - 1 : i - temp - 1 + 2 * temp + j]] = 1 m[s[i]] = 1 for i in m: print (i) find_substr("bddaaa")
อินพุต
bddaaa
ผลลัพธ์
a aa b aaa d dd