Giả sử chúng ta có một chuỗi S. Chúng ta phải tìm chuỗi con palindromic dài nhất trong S. Chúng ta giả sử rằng độ dài của chuỗi S là 1000. Vì vậy, nếu chuỗi là "BABAC" , thì chuỗi con palindromic dài nhất là “BAB”.
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau
- Xác định một ma trận vuông có thứ tự giống như độ dài của chuỗi và điền nó bằng Sai
- Đặt các phần tử đường chéo chính là true, do đó DP [i, i] =True cho tất cả các i từ 0 đến thứ tự - 1
- start:=0
- cho l trong phạm vi 2 đến độ dài của S + 1
- cho tôi trong phạm vi từ 0 đến độ dài của S - l + 1
- end:=i + l
- nếu l =2, thì
- nếu S [i] =S [end - 1], thì
- DP [i, end - 1] =True, max_len:=l và start:=i
- nếu S [i] =S [end - 1], thì
- nếu không thì
- nếu S [i] =S [end - 1] và DP [i + 1, end - 2], thì
- DP [i, end - 1] =True, max_len:=l và start:=i
- nếu S [i] =S [end - 1] và DP [i + 1, end - 2], thì
- cho tôi trong phạm vi từ 0 đến độ dài của S - l + 1
- trả về một chuỗi con từ bắt đầu chỉ mục đến bắt đầu + max_len
Ví dụ (Python)
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
class Solution(object): def longestPalindrome(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 s[start:start+max_length] ob1 = Solution() print(ob1.longestPalindrome("ABBABBC"))
Đầu vào
"ABBABBC"
Đầu ra
"BBABB"