GitHubSeob
C++ / 백준 / 5582 / 공통 부분 문자열 본문
문제
https://www.acmicpc.net/problem/5582
5582번: 공통 부분 문자열
두 문자열이 주어졌을 때, 두 문자열에 모두 포함된 가장 긴 공통 부분 문자열을 찾는 프로그램을 작성하시오. 어떤 문자열 s의 부분 문자열 t란, s에 t가 연속으로 나타나는 것을 말한다. 예를 들
www.acmicpc.net
문제풀이
두 포인터 알고리즘을 이용하였다.
변수로 시작 지점(s)과 끝 지점(e)을 두고, 첫 번째 문자열에 대해 s인덱스부터 e인덱스까지 문자를 더해 새로운 문자열을 만든다.
그다음 해당 문자열이 두 번째 문자열에 있는지 find함수를 이용하여 구한다.
있다면 e를 +1 하고, 문자열에 e인덱스를 더해 새로운 문자열을 만든다.
없다면 s를 +1 하고, 문자열에 맨 앞을 erase를 이용하여 지운다.
1. 처음 시작)
2. 1의 문자가 있는 경우
1의 문자가 두 번째 문자열에 있는 경우 e를 늘린다.
이러면 새로운 문자열은 string[0] + string[1]이 된다.
3. 2에서 새로 만든 문자열이 두 번째 문자열에 없는 경우이다.
2에서 만든 문자열이 없기 때문에 s를 1 늘려준다.
코드
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
string s1(""), s2("");
string s("");
cin >> s1 >> s2;
int answer(0);
int idx1(0), idx2(0);
int start(0);
int end(0);
s = s1[0];
while (end <= s1.size() && start<s1.size()) {
if (start > end) {
end = start;
s = s1[start];
}
else if (s2.find(s) != string::npos) {
answer = max(answer, end - start + 1);
end++;
s += s1[end];
}
else {
start++;
if (!s.empty())
s.erase(0, 1);
}
}
cout << answer;
}
'Baekjoon > Gold' 카테고리의 다른 글
C++ / 백준 / 6593 / 상범 빌딩 (0) | 2022.01.22 |
---|---|
C++ / 백준 / 15686 / 치킨 배달 (0) | 2022.01.17 |
C++ / 백준 / 7453 / 합이 0인 네 정수 (0) | 2021.10.15 |
C++ / 백준 / 2143 / 두 배열의 합 (0) | 2021.10.15 |
C++ / 백준 / 2632 / 피자판매 (0) | 2021.10.15 |