108 lines
2 KiB
Markdown
108 lines
2 KiB
Markdown
# 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;
|
||
}
|
||
};
|
||
``` |