龙空技术网

LeetCode基础算法题第106篇: 求最长回文串

吾是我师 445

前言:

如今朋友们对“java回文字符串”可能比较讲究,兄弟们都想要分析一些“java回文字符串”的相关内容。那么小编同时在网络上搜集了一些有关“java回文字符串””的相关资讯,希望我们能喜欢,各位老铁们快快来学习一下吧!

技术提高是一个循序渐进的过程,所以我讲的leetcode算法题从最简单的level开始写的,然后到中级难度,最后到hard难度全部完。

目前我选择C语言,Python和Java作为实现语言,因为这三种语言还是比较典型的。由于篇幅和精力有限,其他语言的实现有兴趣的朋友请自己尝试。

初级难度说的差不多的时候,我打算再加点其他内容,我可能会从操作系统到协议栈,从分布式聊到大数据框架,从大数据聊到人工智能,... ...。

如果有任何问题可以在文章后评论或者私信给我。

我会持续分享下去,敬请您的关注。

LeetCode 409. 最长回文串(Longest Palindrome)

问题描述:

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

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

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

示例:C语言实现:

这里的回文是指:一个字符串和它的反转字符是相同的。

那么很明显这种字符串一定是关于中间左右对称的。

因此我们很容易推断出这种回文字符串存在三种形式,如上图:

字符串长度为0。字符串长度是偶数,那么每种字符都存在偶数个。字符串长度是奇数,除了最中间的那种字符出现奇数次以外,其他字符都必须出现偶数次。

因此对字符串s来说,要构成的最大的回文字符串,应该满足:

所有出现偶数次的字符都可以全部添加到回文字符串中,如果存在出现奇数次的字符,那么次数最大的那个可以作为回文字符串中的中间字符。如果还存在其他的出现奇数次字符,假设它长度是n,那么它不能全部添加到回文字符串中,但是可以添加n-1个字符进去,因为n-1是偶数。

我们可以将第二条和第三条放在一起表述:

如果存在n个出现次数为奇数次的字符,其中C1,C2…Cn表示每个字符出现的次数,那么可以有S(odds) = (C1-1)+(C2-1)+…+(Cn-1) + 1 = C1+C2+…+Cn-n+1个字符可以添加到回文字符串中。

我们再将第一条加进来:

如果存在m个出现次数为偶数次的字符,其中E1,E2…En表示每个字符出现的次数,那么可以有S(evens) = E1+E2+…+En = (E1-0)+(E2-0)+…+(En-0) + 0个字符可以添加到回文字符串中。

则,构成的最大的回文字符串长度Len(P) = S(odds) + S(evens)

注意加粗的部分,表明S(odds) 和 S(evens)可以用相同的表达式表示,不同的是每个元素减去的数不同,奇数时减1,偶数时减0,以及末尾加的数不同,奇数时加1,偶数时加0。

所以最终可以写出如下代码:

Java语言的实现:

Java 的实现和C语言的实现一致,不再撰述。

代码如下:

python语言的实现:

python 的实现和C语言的实现一致,不再撰述。

代码如下:

标签: #java回文字符串