409. 最长回文串

问题描述

https://leetcode.cn/problems/longest-palindrome/description/

解题思路

这题被划分在了贪心tag下面。

贪心算法解题有个前提条件,就是说我们能够找到局部的最优解。然后将局部最优解组合起来,得到全局的最优解。

这个题目,明显可以用贪心来解决。因为回文串有个特性,如果回文串是偶数个长度,那其中出现过的所有字符必然都出现了偶数次。

如果回文串是奇数长度,那其中出现过1个单独出现的字符,其余的字符必然出现了偶数次。

所以我们开始求局部解,如果我们把所有字符都求到它最多的偶数次,加起来,就是全局解了。如果加起来之后还有落单的,那可以再+1,构造奇数次的解。

注意哈,这种在线处理的题目,需要进行边界处理。

代码

class Solution:
    def longestPalindrome(self, s: str) -> int:
        if len(s) < 2:
            return len(s)
        s = sorted(s)
        idx = 0
        tmp = s[0]
        res = 0
        while idx < len(s):
            t_idx = idx
            while idx < len(s) and s[idx] == tmp:
                idx += 1
            if idx != t_idx:
                res += self.get_best(s[t_idx: idx])
# 边界处理 如果不能继续了,就不往下走了
if idx < len(s): tmp = s[idx] else: idx += 1 if res != len(s): res += 1 return res def get_best(self, s): return len(s) if len(s)%2 == 0 else len(s)-1

 

posted @ 2023-01-10 11:31  BJFU-VTH  阅读(25)  评论(0)    收藏  举报