알고리즘/백준

백준 BOJ 5582 공통 부분 문자열

등반 2021. 12. 29. 00:41

https://www.acmicpc.net/problem/5582

 

5582번: 공통 부분 문자열

두 문자열이 주어졌을 때, 두 문자열에 모두 포함된 가장 긴 공통 부분 문자열을 찾는 프로그램을 작성하시오. 어떤 문자열 s의 부분 문자열 t란, s에 t가 연속으로 나타나는 것을 말한다. 예를 들

www.acmicpc.net

문제 해설

부분 문자열은 한 문자열에서 연속한 부분을 떼어낸 문자열이다.

주어진 문자열 중 긴 문자열에 더미 문자열을 붙이고 완전탐색 시켰는데 통과했다... 얼떨떨했따...

긴 문자열의 비교 시작 부분을 이동시키며, 작은 문자열의 길이만큼 비교했다.

#include <iostream>
#define fio cin.tie(0)->sync_with_stdio(0)
using namespace std;

int max_common(const string& big_, const string& small){
    int ret = 0;
    string big="";
    for(int i=0; i< small.size(); i++){
        big += 'x';//더미
    }
    big += big_;
    for(int offset=0; offset< big.size(); offset++){
        for(int j=0, cnt=0; j<small.size() && offset+j < big.size(); j++){
            if(big[offset+j] == small[j]){
                cnt++;
            }else{
                cnt = 0;
            }
            ret = max(ret ,cnt);
        }
    }
    return ret;
}

int main() {
	fio;
    string A, B; cin >> A >> B;
    if(A.size() <= B.size()){
        cout << max_common(B, A);
    }else{
        cout << max_common(A, B);
    }
	return 0;
}