2023. 5. 10. 10:39ㆍC++/알고리즘
https://www.acmicpc.net/problem/5582
5582번: 공통 부분 문자열
두 문자열이 주어졌을 때, 두 문자열에 모두 포함된 가장 긴 공통 부분 문자열을 찾는 프로그램을 작성하시오. 어떤 문자열 s의 부분 문자열 t란, s에 t가 연속으로 나타나는 것을 말한다. 예를 들
www.acmicpc.net
문제 이름 그대로 Longest Common Substring의 길이를 찾는 문제
LCS에 대하여 정리해놓은 글이 있다
https://djgameprogramming.tistory.com/110
Longest Common Subsequence/Substring(LCS)
DP를 활용하는 알고리즘 중 하나. Longest Common Subsequence는 최장 공통 부분 수열 Longest Common Substring는 최장 공통 부분 문자열 문자열은 연속되는 순서를 의미하고 수열은 연속되지 않는 순서도 모두
djgameprogramming.tistory.com
1. 이중 배열 DP를 생성하고 받은 문자열의 길이만큼 이중 반복문을 돌린다.
2. subject와 target에 대하여 각각 i번째와 j번째 문자가 같을때 DP[i][j]의 값은 DP[i-1][j-1]에서 1을 더해준 값이다.
3. 2번의 과정에서 여태까지 저장한 LCS의 길이보다 큰 값이 나왔다면 갱신해준다.
4. subject와 target에 대하여 각각 i번째와 j번째 문자가 다르다면 DP[i][j]를 0으로 초기화한다.
저장한 LCS의 길이를 출력해주면 된다.
#include <iostream>
using namespace std;
int DP[4001][4001] = { 0, };
int ret = 0;
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
string str1;
string str2;
cin >> str1 >> str2;
int size1 = str1.length();
int size2 = str2.length();
for (int i = 1; i <= size1; i++)
{
for (int j = 1; j <= size2; j++)
{
if (str1[i-1] == str2[j-1])
{
DP[i][j] = DP[i - 1][j - 1] + 1;
ret = max(ret, DP[i][j]);
}
}
}
cout << ret;
}
'C++ > 알고리즘' 카테고리의 다른 글
여행(DP) (0) | 2023.05.11 |
---|---|
벽장문의 이동(DP) (0) | 2023.05.10 |
Longest Common Subsequence/Substring(LCS) (1) | 2023.05.10 |
구간 나누기(DP) (0) | 2023.05.04 |
고층빌딩(DP) (1) | 2023.05.02 |