From bed68fca969d77a2485893624dec4410c94d37cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=94=90=E6=A0=91=E6=A3=AE?= <14021051@buaa.edu.cn> Date: Sat, 15 Sep 2018 23:22:31 +0800 Subject: [PATCH] Create 409. Longest Palindrome.md --- 409. Longest Palindrome.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 409. Longest Palindrome.md diff --git a/409. Longest Palindrome.md b/409. Longest Palindrome.md new file mode 100644 index 0000000..9dec7cf --- /dev/null +++ b/409. Longest Palindrome.md @@ -0,0 +1,26 @@ +# [409. Longest Palindrome](https://leetcode.com/problems/longest-palindrome/description/) +# 思路 +给出一些包含大小写的字母,判断能由这些字母组成的回文串最长为多少。 +分析:如果某个字母出现次数为偶数,那肯定全部都能放进目标最长的回文串,如果某个字母出现次数为奇数,则只能放下不超过这个奇数的最大偶数(也就是减1)个该字母。 +不过需要注意的是,如果出现了出现次数为奇数的字母,则最后的回文串长度按照上诉思路计算后还应该加1,此时回文串长度为奇数,例如dccaccd。 +时间复杂度O(n), 空间复杂度O(1) +# C++ +``` +class Solution { +public: + int longestPalindrome(string s) { + vectorcount(52, 0); + for(int i = 0; i < s.size(); i++){ + if(s[i] >= 'a' && s[i] <= 'z') count[s[i] - 'a']++; + else count[s[i] - 'A' + 26]++; + } + int odd_tag = 0, res = 0; + for(int n: count){ + if(n % 2 == 1) odd_tag = 1; + res += (n - n % 2); + } + res += odd_tag; + return res; + } +}; +```