(Good topic)哈希表:最长回文串(3.19 leetcode每日打卡)

给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。

在构造过程中,请注意区分大小写。比如 "Aa" 不能当做一个回文字符串。

注意:
假设字符串的长度不会超过 1010。

示例 1:

输入:
"abccccdd"

输出:
7

解释:
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。

解题思路

要想构成回文串,则字符串总就有且仅有一个奇数串,前几天做了那个单词的题,用的哈希表,这个还是用哈希表,用定义一个hash数组来存储小写和大写字母,然后遍历hash数组,遇到偶数直接计入回文串长度,遇到奇数再存入一个tem数组记录,最后比较tem数组中最大长度的奇数串

计入回文串长度还有一个最重要的就是,其余的长度的奇数串不能都舍去,需要减一计入回文串长度。

 1 int longestPalindrome(char* s)
 2 {
 3     int hash[52] = { 0 };
 4     int tem[1000] = { 0 };  //用来记录奇数最大数值
 5     int cnt = 0;
 6     int i, j = -1;
 7 
 8     for (i = 0; s[i]; i++)
 9     {
10         if (s[i] >= 'a' && s[i] <= 'z')
11         {
12             hash[s[i] - 97]++;
13         }
14         else
15         {
16             hash[s[i] - 39]++;
17         }
18     }
19 
20     for (i = 0; i < 52; i++)
21     {
22         if (hash[i] % 2 == 0)
23         {
24             cnt += hash[i];
25         }
26         else if (hash[i] % 2 != 0) // 记录非偶数
27         {
28             tem[++j] = hash[i];
29         }
30     }
31 
32     int max;
33     int symbol; //记录最长计数串的下标
34     max = tem[0];  //最长的奇数串
35     symbol = 0;
36     for (i = 1; i < j+1; i++)
37     {
38         if (tem[i] > max)
39         {
40             max = tem[i];
41             symbol = i;
42         }
43     }
44 
45     //printf("%d", symbol);
46     for (i = 0; i < j + 1; i++)
47     {
48         if (i != symbol)
49         {
50             cnt = cnt + tem[i] - 1;
51         }
52     }
53     return cnt + max;
54 }

 

 
 
posted @ 2020-03-19 09:31  Xxaj5  阅读(224)  评论(0编辑  收藏  举报