(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 }