[ 백트래킹 코드 - 시간초과 ]
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int ans;
void func(int cur, string s, string origin)
{
if(cur == origin.length())
{
string rev = s;
reverse(rev.begin(), rev.end());
if(rev == s) ans = max(ans, (int)s.length());
return;
}else{
for(int i=cur;i<origin.length();i++)
{
string rev = s;
reverse(rev.begin(), rev.end());
if(rev == s) ans = max(ans, (int)s.length());
func(i+1, s+origin[i], origin);
}
}
}
int solution(string s)
{
func(0, "", s);
return ans;
}
- 시간초과
: 문자열 s
의 길이
가 2500
까지라서 엄~~청 크다 --> 터무니없이 실패ㅎㅎ
(재귀
를 이용해 푸는 문제들은 대상인 N
이 10
만 되도 최대O(2^n) 정도
로 급격히 커짐)
[ 유효성 검사 실패 ]
#include <iostream>
#include <string>
#include <algorithm>
#include <stack>
using namespace std;
bool ch[2501];
int solution(string s)
{
int ans=1;
for(int i=0;i<s.length();i++)
{
int endsize = min((int)((s.length()-1) - i), i);
for(int size=endsize;size>=1;size--)
{
string tmp = s.substr(i-size,size*2+1);
string rev = tmp;
reverse(rev.begin(), rev.end());
if(rev == tmp) {
ans = max(ans, (int)tmp.length());
break;
}
}
int lastsize = (s.length()-1) - i;
for(int size=lastsize;size>=1;size--)
{
string tmp = s.substr(i,size+1);
string rev = tmp;
reverse(rev.begin(), rev.end());
if(rev == tmp) {
ans = max(ans, (int)tmp.length());
break;
}
}
}
return ans;
}
- 접근
정답이 짝수
일때와 홀수
일 때 다르게 검사 해야한다는 것을 느껴서 나눔
--> 이렇게 푸는 풀이도 있지만 아래에 있는 풀이가 더 깔끔함
- 유효성 검사
: 유효성 검사 1번
에서 계속 막힘 - 시간초과
(줄이려고 substr
, reverse
줄인다고 줄였으나 실패..)
substr()
-> 문자를 자르고 복사하는 과정 -> O(N)
reverse()
-> 문자를 그 자리에서 역순으로 뒤집음 -> O(N)
[ 정답코드 ]
#include <iostream>
#include <string>
#include <algorithm>
#include <stack>
using namespace std;
int solution(string s)
{
int len=s.length();
while(len>=2)
{
for(int i=0;i<=s.length()-len;i++)
{
int left = i;
int right = i+len-1;
bool flag = false;
while(left <= right)
{
if(s[left] != s[right]) {
flag = true;
break;
}
left++;
right--;
}
if(flag) continue;
return len;
}
len--;
}
return 1;
}
- 핵심
1) 긴 문자열
부터 검사해서 찾으면 바로 return
해야 함
(이렇게 안하면 유효성 통과X)
2) left / right 변수
로 양옆
에서 인덱스로 검사하여 짝수 / 홀수
경우를 나누지 않아도 됨
(길이가 짝수
이든 홀수
이든 같은 로직으로 실행가능)
- 느낀 점
: 종종 문자열
에서 특정 패턴
을 찾는 문제에서 left/right
나 front/back
으로 양옆에서 접근하는 방식
으로 빠르게 문제를 푸는 문제들이 있는것 같다.(기억하자)