409:最长回文串

This commit is contained in:
轩辕龙儿 2022-03-25 23:27:08 +08:00
parent a91b04edf1
commit a46b03698b
3 changed files with 125 additions and 0 deletions

View File

@ -0,0 +1,62 @@
//给定一个包含大写字母和小写字母的字符串 s 返回 通过这些字母构造成的 最长的回文串
//
// 在构造过程中请注意 区分大小写 比如 "Aa" 不能当做一个回文字符串
//
//
//
// 示例 1:
//
//
//输入:s = "abccccdd"
//输出:7
//解释:
//我们可以构造的最长的回文串是"dccaccd", 它的长度是 7
//
//
// 示例 2:
//
//
//输入:s = "a"
//输入:1
//
//
// 示例 3:
//
//
//输入:s = "bb"
//输入: 2
//
//
//
//
// 提示:
//
//
// 1 <= s.length <= 2000
// s 只能由小写和/或大写英文字母组成
//
// Related Topics 贪心 哈希表 字符串 👍 393 👎 0
package leetcode.editor.cn;
//409:最长回文串
public class LongestPalindrome {
public static void main(String[] args) {
Solution solution = new LongestPalindrome().new Solution();
}
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public int longestPalindrome(String s) {
int[] letters = new int[128];
char[] arr = s.toCharArray();
for (char c : arr) letters[c]++;
int res = 0;
for (int i : letters) res += i - (i % 2);
return res == arr.length ? res : res + 1;
}
}
//leetcode submit region end(Prohibit modification and deletion)
}

View File

@ -0,0 +1,38 @@
<p>给定一个包含大写字母和小写字母的字符串<meta charset="UTF-8" />&nbsp;<code>s</code>&nbsp;,返回&nbsp;<em>通过这些字母构造成的 <strong>最长的回文串</strong></em>&nbsp;</p>
<p>在构造过程中,请注意 <strong>区分大小写</strong> 。比如&nbsp;<code>"Aa"</code>&nbsp;不能当做一个回文字符串。</p>
<p>&nbsp;</p>
<p><strong>示例 1: </strong></p>
<pre>
<strong>输入:</strong>s = "abccccdd"
<strong>输出:</strong>7
<strong>解释:</strong>
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。
</pre>
<p><strong>示例 2:</strong></p>
<pre>
<strong>输入:</strong>s = "a"
<strong>输入:</strong>1
</pre>
<p><strong>示例 3:</strong></p>
<pre>
<strong>输入:</strong>s = "bb"
<strong>输入:</strong> 2
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= s.length &lt;= 2000</code></li>
<li><code>s</code>&nbsp;只能由小写和/或大写英文字母组成</li>
</ul>
<div><div>Related Topics</div><div><li>贪心</li><li>哈希表</li><li>字符串</li></div></div><br><div><li>👍 393</li><li>👎 0</li></div>

View File

@ -0,0 +1,25 @@
首先计算每个字符出现的次数
每有两个同样的字符,就可以放在结果的回文两端,长度便可以 $+2$
当最后得到的回文的长度跟 $s$ 一样长时,说明每个字符都出现了 $2n$ 遍,即每个字符都已经被使用
如果长度不等于 $s$, 说明至少有一个字符单独出现,将它放在回文中间使结果的长度 $+1$
* []
```Java
class Solution {
public int longestPalindrome(String s) {
int[] letters = new int[128];
char[] arr = s.toCharArray();
for(char c : arr) letters[c]++;
int res = 0;
for(int i : letters) res += i - (i % 2);
return res == arr.length ? res : res + 1;
}
}
```