Study

(Java Greedy) 문자열안에 포함된 가장 긴 팰린드롬(palindrome)문자열

Developer RyanKim 2019. 3. 15. 22:11




(Java / 거꾸로해도 같은 문자열 / 팰린드롬(palindrome) )

문제

거꾸로해도 같은 문자열을 팰린드롬(palindrome) 이라고 한단다.

문자열이 주어지면 그안에 포함된 가장 긴 팰린드롬 문자열의 길이가 몇인지 구하는 알고리즘


ex) "dkwqabcdcbawp" 면 7을 반환 / "abba" 면 4를 반환



풀이를 보지않고 풀어서 정확한지는 모르겠지만 내가 푼 방식은


1. input(주어진 문자열)을 거꾸로 뒤집은 문자열을 만든다. (reverse)

 String input = "xxxabbbaoowla" -> String reverse = "alwooabbbaxxx"


2. input과 reverse에 같은 내용을 포함하는 가장 긴부분을 찾는다.

String input = "xxxabbbaoowla" -> String reverse = "alwooabbbaxxx"


3. 먼저 input의 0 ~ 2 문자열을 reverse에 포함되어있는지 보고 포함되지 않았다면 1~3 문자열로 다시 검사한다.

만약 포함되는 문자가 나왔으면 max를 2로 하고 반복을 종료한 후, 길이를 늘려 0~3 문자열이 reverse에 포함되었는지 검사.


설명을 적어놓고보니 greedy 접근방법이 아닌것 같다.

이 순회방식을 긴것부터 줄여가면서 포함여부를 확인하면 greedy가 될것같은 느낌이다.


String input = "dkwqabcdcbawp";
String reverse = "";


// 리버스 생성
for(int i= input.length()-1; i >= 0; i--){
reverse += input.charAt(i);
}

System.out.println(input);
System.out.println(reverse);
System.out.println("======================");

// 리버스가 포함하는 가장긴 문자열 찾기
int max = 1;
for(int i = 2; i <= input.length() ;i++){
for(int j = 0; j <= input.length() - i; j++){
if(reverse.contains(input.substring( j, j+i))){
max = i;
break;
}
}
}
System.out.println(max);





* 추가


public static void main(String[] args) {

String input = "xxxabbbaoowla";
System.out.println(solve(input));

}

public static int solve(String input){

String reverse = "";

for(int i= input.length()-1; i >= 0; i--){
reverse += input.charAt(i);
}

System.out.println(input);
System.out.println(reverse);
System.out.println("======================");

// 가장긴 리버스가 같은 문자열 고르기
int max = 1;
for(int i = input.length(); i > 1 ; i--){
for(int j = 0; j <= input.length() - i; j++){
if(reverse.contains(input.substring( j, i+j))){
max = i;
return max;
}
}
}
return max;
}