1.9 KiB
1.9 KiB
Leetcode Longest-Palindrome
2022-09-05 17:27
Algorithms:
#algorithm #greedy
Data structures:
#DS #string
Difficulty:
#coding_problems #difficulty_easy
Additional tags:
#leetcode
Revisions:
N/A
Links:
Problem
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.
Examples
Example 1:
Input: s = "abccccdd" Output: 7 Explanation: One longest palindrome that can be built is "dccaccd", whose length is 7.
Example 2:
Input: s = "a" Output: 1 Explanation: The longest palindrome that can be built is "a", whose length is 1.
Constraints
1 <= s.length <= 2000
s
consists of lowercase and/or uppercase English letters only.
Thoughts
[!summary] This is a #greedy problem.
The solution is simple: count the apperances, sort it using
std::greater(), and select all even number, for odd
number i
:
- if odd numbers has been used:
ans += i - 1
(make it even) - if not:
ans += i
, and mark odd number used
Solution
class Solution {
public:
int longestPalindrome(string s) {
int ans = 0;
bool used = false;
vector<int> table(52, 0);
// record in table.
for (char ch : s) {
if (ch <= 'Z') {
table[ch - 'A' + 26]++;
} else {
table[ch - 'a']++;
}
}
sort(table.begin(), table.end(), greater<int>());
for (int i : table) {
if (i % 2 == 1) {
if (used == false) {
used = true;
ans += i;
} else {
ans += i - 1;
}
} else {
if (i == 0) {
break;
}
ans += i;
}
}
return ans;
}
};