반응형
리뷰
브루트포스 알고리즘을 통해 문자열의 길이를 줄이며 각 문자열의 LPS를 구하는 문제
https://www.acmicpc.net/problem/1701
전역 변수
- str : 탐색을 진행할 문자열 변수
- n, ans : 초기 문자열의 길이 n, 가장 긴 길이를 저장할 변수 ans
함수
1. getLPS
void getLPS(string str)
문자열의 LPS를 구하는 함수
- 매개 변수는 초기 문자열에서 왼쪽의 문자열이 한개씩 날아간 문자열들이 주어진다.
- 해당 문자열에서의 LPS를 구하고 LPS중 가장 큰 값이 ans에 저장되게 된다.
문제풀이
- 초기 문자열 str을 입력 받고 n에 str의 길이를 저장한다.
- n번의 for문을 개행하고 str의 왼쪽에서부터 한글자씩 제거하며 getLPS함수의 매개변수로 전달해 준다.
- n번의 반복문을 끝내고 ans에 저장된 답을 출력해 준다.
참고 사항
- n번의 for문을 통해 왼쪽에서부터 문자를 제거하는 이유는 탐색 인덱스를 항상 0번으로 하면 안되기 때문이다.
- 그냥 LPS를 구해도 예제는 정답이 잘 출력 되므로 나처럼 혼동하지 않아야 한다.
정답 코드
#include<iostream>
#include<string>
#include<vector>
using namespace std;
string str;
int n, ans;
void getLPS(string str) {
int cur = 0, i = 1, length = str.size();
vector<int> lps(n, 0);
while (i < length) {
if (str[cur] == str[i]) {
cur++;
lps[i] = cur;
ans = max(ans, cur);
i++;
}
else {
if (cur != 0) cur = lps[cur - 1];
else {
lps[i] = 0;
i++;
}
}
}
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
getline(cin, str);
n = str.size();
for (int i = 0; i < n; i++) getLPS(string(str.begin() + i, str.end()));
cout << ans << "\n";
}
728x90
반응형
'알고리즘 공부 > C++' 카테고리의 다른 글
[G2] 백준 2871번 아름다운 단어 C++ 그리디 알고리즘, 우선순위 큐, 구현 (0) | 2024.10.11 |
---|---|
[G2] 백준 13334번 철로 C++ 우선순위 큐, 정렬, 스위핑 (0) | 2024.10.11 |
[P5] 백준 1786번 찾기 C++ KMP, 문자열, LPS (0) | 2024.10.10 |
[G3] 백준 16934번 게임 닉네임 C++ 트라이, 문자열, 해시맵 (1) | 2024.10.10 |
[G3] 백준 7432번 디스크 트리 C++ 트라이, 문자열, DFS (1) | 2024.10.09 |