LeetCode——409.最长回文串

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

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

注意:
假设字符串的长度不会超过 1010。
示例 1:
输入:
"abccccdd"
输出:
7
解释:
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。

解法一:

回文串是一个对称的字符串,由n个个数为偶数的字符+对称轴上的任意一个个数为奇数的字符(可以为空)构成,如aabb或aa( c )bb。这意味着我们只需要知道给定字符串中每个字符出现的个数,若为偶数个则直接加在总数count中,若为奇数则将个数减一变成偶数加在总数count中。如果存在奇数则count最后再加一个1表示选定任意一个奇数个数的字符放在对称轴上。

给出的字符串区分大小写,我使用了两个数组分别接收大写和小写字符的个数,然后对数组中的每一个值进行判断,想的有些复杂了,耗时较多在这里插入图片描述

class Solution {
 //创建两个桶分别存放大小写字母
        //ASCII码65-90为A-Z 97-122为a-z
        int[] upperCaseBook=new int[26];
        int[] lowerCaseBook=new int[26];
        char[] chars=s.toCharArray();
        //遍历字符数组
        for(int i=0;i<chars.length;i++){
            //字符为大写
            if(chars[i]<97){
                upperCaseBook[chars[i]-65]++;
            }
            else{
                lowerCaseBook[chars[i]-97]++;
            }
        }
        //分别统计桶中存放偶数个元素的个数的桶的和存奇数个元素的桶
        //桶中为偶数个数则直接加入count,为奇数个数则减一后加入count
        //最后挑选任意一个奇数个数的桶对应的字符作为回文串中间位置的字符串,即最后给count加一个1
        int count=0;
        //判断是否存在奇数,不存在则最后count不用加1
        boolean flag=false;
        for(int i=0;i<26;i++){
          if(upperCaseBook[i]%2==0){
            count=count+upperCaseBook[i];
          }
          if(lowerCaseBook[i]%2==0){
            count=count+lowerCaseBook[i];
          }  
          if(upperCaseBook[i]%2!=0){
            flag=true;
            count+=upperCaseBook[i]-1;
          }
          if(lowerCaseBook[i]%2!=0){
            flag=true;
            count+=lowerCaseBook[i]-1;
          }  
               
        }
        if(flag){
            count+=1;
        }
        return count;
}
解法二

源自LeetCode官方题解:LeetCode题解
这题只需要我们求得最长回文串的个数,并不关注具体的字符串的值,所以并不需要特别去用两个数组存储字符串,只需要创建一个数组能把ASCII码从a-Z的字符都存起来的数组就可以了,甚至不需要特别去考虑这个数组的空间大小为58,直接定义一个大小为128的数组方便存放数据就行了,将奇数个数转化成偶数个数可以通过整除2再乘2的方式得到,这样整个方法j就简单很多了。

class Solution {
    public int longestPalindrome(String s) {
        int[] arr = new int[128];
        for (char c: s.toCharArray()){            
            arr[c]++;
        }
        int count = 0;
        for (int v: arr) {
            count += v / 2 * 2;
            if (v % 2 == 1 && count % 2 == 0){
                count++;
            }           
        }
        return count;
    }
}

在这里插入图片描述

收获

解题时先分析清楚题目的要求,减少不必要的操作

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 最长回文子串可以通过两种方法来实现。第一种是使用中心扩展法,代码如下: ```python class Solution: def check(self, s, l, r): while l >= 0 and r < len(s) and s[l == s[r]: l -= 1 r += 1 return l + 1, r - 1 def longestPalindrome(self, s: str) -> str: start, end = 0, 0 for x in range(len(s)): l1, r1 = self.check(s, x, x) l2, r2 = self.check(s, x, x + 1) if r1 - l1 > end - start: start, end = l1, r1 if r2 - l2 > end - start: start, end = l2, r2 return s[start:end+1] ``` 第二种方法是使用动态规划,代码如下: ```python class Solution: def longestPalindrome(self, s: str) -> str: res = '' for i in range(len(s)): start = max(0, i - len(res) - 1) temp = s[start:i+1] if temp == temp[::-1]: res = temp else: temp = temp<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [5. 最长回文子串(Python 实现)](https://blog.csdn.net/d_l_w_d_l_w/article/details/118861851)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [LeetCode(Python3)5.最长回文子串](https://blog.csdn.net/weixin_52593484/article/details/124718655)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [力扣 (LeetCode)刷题笔记5.最长回文子串 python](https://blog.csdn.net/qq_44672855/article/details/115339324)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值