LeetCode - Longest Palindrome (Javascript)

문제 설명

앞으로 읽어도 똑같고, 뒤로 읽어도 똑같은 문자열의 최장 길이를 구하는 문제다.

Given a string s which consists of lowercase or uppercase letters, return *the length of the longest palindrome* that can be built with those letters.

Letters are case sensitive, for example, "Aa" is not considered a palindrome here.

Example 1:

1
2
3
4
Input: s = "abccccdd"
Output: 7
Explanation:
One longest palindrome that can be built is "dccaccd", whose length is 7.

Example 2:

1
2
Input: s = "a"
Output: 1

Example 3:

1
2
Input: s = "bb"
Output: 2

Constraints:

  • 1 <= s.length <= 2000
  • s consists of lowercase and/or uppercase English letters only.

소스 코드

난이도가 낮은 문제였기에 쉽게 풀어낼 수 있었다.
핵심은 오브젝트에 각 캐릭터별 개수를 담은 뒤, 개수를 각각 2로 나눠 → 나누어 떨어졌을 경우와 떨어지지 않았을 경우에 대한 핸들링을 하는 것이었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
const longestPalindrome = (s) => {
let answer = 0;
const charObj = {};
[...s].forEach((char) =>
charObj[char] ? charObj[char]++ : (charObj[char] = 1)
);
for (let key in charObj) {
if (charObj[key] > 1) {
answer += charObj[key] % 2 === 0 ? charObj[key] : charObj[key] - 1;
charObj[key] = charObj[key] % 2;
}
}
for (let key in charObj) {
if (charObj[key] === 1) {
answer += 1;
break;
}
}
return answer;
};

제출 결과


소스 코드 (간소화 버전)

for문을 한 번만 사용해도 문제를 풀 수 있을 것 같아 코드를 조금 더 간소화 해봤다.

1
2
3
4
5
6
7
8
9
const longestPalindrome = (s) => {
let answer = 0;
let charObj = {};
for (let char of s) {
charObj[char] = (charObj[char] || 0) + 1;
if (charObj[char] % 2 === 0) answer += 2; // 증가하는 과정에서 2로 나누어 떨어지는지 체크
}
return s.length > answer ? answer + 1 : answer;
};

Author

Hoonjoo

Posted on

2022-04-07

Updated on

2022-04-08

Licensed under

Comments