Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

โปรแกรมค้นหาความยาวของสตริงย่อยพาลินโดรมที่ยาวที่สุดใน Python


สมมติว่าเรามีสตริง S เราต้องหาความยาวของสตริงย่อยพาลินโดรมที่ยาวที่สุดใน S เราถือว่าความยาวของสตริง S คือ 1000 ดังนั้นหากสตริงคือ "BABAC" สตริงย่อยพาลินโดรมที่ยาวที่สุดคือ "BAB" และความยาวเท่ากับ 3.

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • กำหนดเมทริกซ์กำลังสองของลำดับเท่ากับความยาวของสตริง และเติมด้วย "เท็จ"

  • ตั้งค่าองค์ประกอบแนวทแยงที่สำคัญเป็นจริง ดังนั้น DP[i, i] =True สำหรับ i ทั้งหมดตั้งแต่ 0 ถึงลำดับ – 1

  • เริ่ม :=0

  • สำหรับ l ในช่วง 2 ถึงความยาวของ S + 1

    • สำหรับฉันในช่วง 0 ถึงความยาวของ S – l + 1

      • จบ :=ผม + ล

      • ถ้า l =2 แล้ว

        • ถ้า S[i] =S[end - 1] แล้ว

          • DP[i, end - 1] =True, max_len :=l, และ start :=i

      • อย่างอื่น

        • ถ้า S[i] =S[end - 1] และ DP[i + 1, สิ้นสุด - 2] แล้ว

          • DP[i, end - 1] =True, max_len :=l, และ start :=i

  • ส่งคืน max_len

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

ตัวอย่าง

class Solution(object):
   def solve(self, s):
      dp = [[False for i in range(len(s))] for i in range(len(s))]
         for i in range(len(s)):
            dp[i][i] = True
         max_length = 1
         start = 0
         for l in range(2,len(s)+1):
            for i in range(len(s)-l+1):

               end = i+l

               if l==2:
                  if s[i] == s[end-1]:
                     dp[i][end-1]=True
                     max_length = l
                     start = i
               else:
                  if s[i] == s[end-1] and dp[i+1][end-2]:
                     dp[i][end-1]=True
                  max_length = l
                  start = i
return max_length

ob = Solution()
print(ob.solve('BABAC'))

อินพุต

"ABBABBC"

ผลลัพธ์

5