notes/OJ notes/pages/Leetcode Longest-Palindrome.md
2022-09-08 16:18:59 +08:00

110 lines
2 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Leetcode Longest-Palindrome
2022-09-05 17:27
> ##### Algorithms:
>
> #algorithm #greedy
>
> ##### Data structures:
>
> #DS #string
>
> ##### Difficulty:
>
> #coding_problem #difficulty_easy
>
> ##### Additional tags:
>
> #leetcode
>
> ##### Revisions:
>
> N/A
##### Links:
- [Link to problem](https://leetcode.com/problems/longest-palindrome/)
---
### 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<int>(), 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
```cpp
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;
}
};
```