문제
요약
문자열 s가 주어지면, s내에서 가장 긴 회문을 출력하라
풀이
/**
* @param {string} s
* @return {string}
*/
var longestPalindrome = function(s) {
for(let i=s.length; i>0;i--){
for(let j=0;j+i<=s.length;j++){
if(checkPalindrome(s.slice(j,j+i))) return s.slice(j,j+i);
}
}
};
function checkPalindrome(str){
for(let i=0; i<str.length/2;i++){
if(str[i] !== str[(str.length-1)-i]) return false;
}
return true;
}
딱히 설명이 필요없는 브루트 포스로 해결한 문제다
Discuss
다른 사람들과 비교해보니 말도 안되게 빠른 해답들이 있어서 한번 살펴봤다
회문을 찾는 알고리즘이 따로 있었다 이 증명을 이해해야하는데 이건 나중에..
Python O(n^2) method with some optimization, 88ms. - LeetCode Discuss
Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.
leetcode.com
그래서 이해는 포기하고 작동 원리만 배워왔다
- 문자열에서 1글자 또는 2글자씩만 검사한다
- 1번에서 검사한 글자들이 회문이라면 글자를 좌우로 확장시킨다
- 확장시킨 글자가 회문이 아닐 때 까지 2를 반복한다
- 가장 긴 회문을 구한다
여기서 1번에서 1글자 또는 2글자만 검사한다는 것은 abcdef의 문자열이 있을 때
i = 0, a와 ab가 회문인지
i = 1, b와 bc가 회문인지
i = 2, c와 cd가 회문인지
...
로 이해하면 된다
var longestPalindrome = function(s) {
var str = '';
for (let i = 0; i < s.length; i++) {
if(i>s.length/2 && s.length-i<str.length) {
console.log(i);
console.log(s.length);
break;
}
for (let j = 0; j < 2; j++) {
var left = i;
var right = left + j;
while (s[left] && s[left] === s[right]) {
left--;
right++;
}
if (right - left - 1 > str.length) {
str = s.slice(left + 1, right);
}
}
}
return str;
};
와 같이 구현할 수 있다
'Algorithm > 문제' 카테고리의 다른 글
leetcode. Reverse Integer (0) | 2021.01.19 |
---|---|
leetcode. ZigZag Conversion (0) | 2021.01.18 |
leetcode. Add Two Numbers (0) | 2021.01.14 |
leetcode. Two Sum (0) | 2021.01.11 |
algospot. PICNIC (미해결) (0) | 2021.01.10 |