두 개의 문자열 X와 Y가 있고 시퀀스 Y의 하위 문자열인 문자열 X의 가장 긴 하위 시퀀스의 길이를 찾아야 한다고 가정합니다. 따라서 X ="ABCD"이고 Y ="BACDBDCD"이면 출력은 3이 됩니다. . "ACD"는 Y의 부분 문자열인 X의 가장 긴 부분 시퀀스이기 때문입니다.
여기서 우리는 이 문제를 해결하기 위해 동적 프로그래밍 접근 방식을 사용할 것입니다. 따라서 X의 길이가 n이고 Y의 길이가 m이면 (m+1)x(n+1) 차수의 DP 배열을 만듭니다. DP[i, j]의 값은 Y[0…i]의 부분 문자열인 X[0…j]의 부분 시퀀스의 최대 길이입니다. 이제 DP의 각 셀에 대해 다음과 같이 됩니다.
- 1~m 범위의 i:
- 1 ~ n
- 범위의 j에 대해
- X[i – 1]이 Y[j – i]와 같으면 DP[i, j] :=1 + DP[i – 1, j – 1]
- 그렇지 않으면 DP[i, j] :=1 + DP[i, j – 1]
- 1 ~ n
그리고 마지막으로 y의 부분 문자열인 x의 가장 긴 부분 시퀀스의 길이는 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