No.0008-CareerCup

Given a string return the longest palindrome that can be constructed by removing or shuffling characters.
Example:
'aha'->'aha'
'ttaatta'->'ttaaatt'
'abc'->'a' or 'b' or 'c'
'gggaaa'->'gaaag' or 'aggga'
给出一个字符串,允许删除字符和任意调换字符串位置,返回其最长的回文字符串。假如有多种可能,返回任意一种。

1. 询问

字符串问题,还是要问一下字符类型。假如还是什么字符都有可能。

2. 分析

暴力破解

暴力破解就是列出所有可能的字符串,然后判断是不是回文串,最后返回最长的那个。复杂度非常高。

如何改进

暴力破解之所以低效,是因为没有利用回文字符串的特点,在不可能构成回文字符串的情况下继续去试,在可以构成回文字符串的情况下不能马上得出结果。
回文字符串有一个很鲜明的特点,整个字符串可以分成L-M-R,其中L和R部分对称,M可以是单个字符也可以是空字符。因此,对回文字符串的字母频数计数,可以知道最多只能有1种字母的频数为奇数,对应M是单个字符的情况;假如M是空字符,那么所有频数都是偶数。
回到本题,按照上面的思路,先对字符串的字母进行计数,O(n)。因为要最长的,因此希望能够尽量少删除。假如有多个字母的计数为奇数,只能留下一个奇数,剩余的奇数字符,都需要舍弃掉1个然后当做偶数处理。
之后就是构造了,还是按照L-M-R的思路来,先把M放了,同时奇数的那个字符-1,假如没有就放空字符。这样剩下的都按照偶数处理,然后先造一边,所有字符取一半放在一起,再逆序放到另外一边即可。还是O(n)。
因此,整体的时间复杂度O(n),空间复杂度O(n)。

3. 代码

class Solution:
    def longestPalindrome(self, s):
        if not s:
            return ''
        d = {}
        L, M = '', ''

        # count chars and let M point to an odd count char else empty
        for c in s:
            if c not in d:
                d[c] = 1
                M = c
            else:
                d[c] += 1
                if d[c] & 1:
                    M = c
                else:
                    if M == c:
                        M = ''

        if M:
            d[M] -= 1

        for k, v in d.items():
            if v:
                L += k * (v // 2)

        return L + M + L[::-1]

4. 总结

难度medium。其实掌握回文字符串的特性,这个问题就迎刃而解了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1、用C语言实现一个revert函数,它的功能是将输入的字符串在原串上倒序后返回。 2、用C语言实现函数void ...
    希崽家的小哲阅读 11,578评论 0 12
  • linux资料总章2.1 1.0写的不好抱歉 但是2.0已经改了很多 但是错误还是无法避免 以后资料会慢慢更新 大...
    数据革命阅读 14,330评论 2 33
  • 最长回文子串——Manacher 算法 1. 问题定义 最长回文字符串问题:给定一个字符串,求它的最长回文子串长度...
    林大鹏阅读 7,760评论 0 6
  • 雨雪大概是下了一整天,行人匆匆,气温骤降,下班后,被友人喊出来上网,所以现在才写,很久没熬夜了。 感觉生活的态...
    DreamWorld阅读 1,328评论 0 0
  • 太过清闲的心,过不了世俗的生活。但仍旧是一种活着。 穿梭在城市里,赶路的过程,莫过于彼时有个温暖的笑,即使陌路。 ...
    她she阅读 1,891评论 3 2

友情链接更多精彩内容