สมมติว่าเรามีสตริง X และ Y สองสตริง และเราต้องหาความยาวของลำดับย่อยที่ยาวที่สุดของสตริง X ซึ่งเป็นสตริงย่อยในลำดับ Y ดังนั้นหาก X ="ABCD" และ Y ="BACDBDCD" ผลลัพธ์จะเป็น 3 เนื่องจาก “ACD” เป็นลำดับย่อยที่ยาวที่สุดของ X ซึ่งเป็นสตริงย่อยของ Y
ที่นี่เราจะใช้แนวทางการเขียนโปรแกรมแบบไดนามิกเพื่อแก้ปัญหานี้ ดังนั้นหากความยาวของ X คือ n และความยาวของ Y คือ m ให้สร้างอาร์เรย์ DP ของลำดับ (m+1)x(n+1) ค่าของ DP[i, j] คือความยาวสูงสุดของลำดับรองของ X[0…j] ซึ่งเป็นสตริงย่อยของ Y[0…i] ตอนนี้สำหรับแต่ละเซลล์ของ DP จะมีดังต่อไปนี้:
- สำหรับ i ในช่วง 1 ถึง m:
- สำหรับ j ในช่วง 1 ถึง n
- เมื่อ X[i – 1] เหมือนกับ Y[j – i] แล้ว DP[i, j] :=1 + DP[i – 1, j – 1]
- มิฉะนั้น DP[i, j] :=1 + DP[i, j – 1]
- สำหรับ j ในช่วง 1 ถึง n
และสุดท้าย ความยาวของลำดับย่อยที่ยาวที่สุดของ x ซึ่งเป็นสตริงย่อยของ y คือ max(DP[i, n]) โดยที่ 1 <=i <=m.
ตัวอย่าง
#include<iostream>
#define MAX 100
using namespace std;
int maxSubLength(string x, string y) {
int table[MAX][MAX];
int n = x.length();
int m = y.length();
for (int i = 0; i <= m; i++)
for (int j = 0; j <= n; j++)
table[i][j] = 0;
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
if (x[j - 1] == y[i - 1])
table[i][j] = 1 + table[i - 1][j - 1];
else
table[i][j] = table[i][j - 1];
}
}
int ans = 0;
for (int i = 1; i <= m; i++)
ans = max(ans, table[i][n]);
return ans;
}
int main() {
string x = "ABCD";
string y = "BACDBDCD";
cout << "Length of Maximum subsequence substring is: " << maxSubLength(x, y);
} ผลลัพธ์
Length of Maximum subsequence substring is: 3