logseq_notes/pages/OJ notes/pages/Leetcode Longest-Palindrome.md
2023-06-14 14:27:22 +08:00

110 lines
1.9 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_problems #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;
}
};
```