LeetCode之“字符串”:最长回文子串
题目要求:
给出一个字符串(假设长度最长为1000),求出它的最长回文子串,你可以假定只有一个满足条件的最长回文串。例如,给出字符串 "abcdzdcab",它的最长回文子串为 "cdzdc"。
解答:
这个题目的一个简单的解法就是对字符串中的每一个字符,同时向其两边延展,以找到最长回文子串。这种方法是可以的,但要处理回文子串长度为奇数和偶数的两种情况是比较麻烦的。如下图的几个字符串:
“a”
"aa"
"aaa"
"aaaa"
一个比较好的解决方法就是利用Manacher算法。这个算法的核心思想在于为原字符串的开头结尾以及每两个相邻的字符之间加入一个特殊的字符,例如‘#’,以达到统一处理回文子串长度为奇数和偶数的两种情况的目的。如一个字符串为S = “abaaba”,处理之后就是S' = “#a#b#a#a#b#a#”。这样,不管回文子串的长度是奇数还是偶数,我们都可以统一处理,因为通过添加特殊字符,原偶数长度的子串中间多了一个特殊字符,这样就能够将其他和奇数长度的字符串一样处理了。我们只需在最后将特殊字符去掉即可。详细可参考LeetCode上的一篇文章。
在LeetCode上通过的C++代码如下:
class Solution {
public:
/**
* @param s input string
* @return the longest palindromic substring
*/
string longestPalindrome(string& s) {
int sz = s.size();
string newStr;
for(int i = ; i < sz; i++)
{
newStr += "#" + s.substr(i, );
}
newStr += "#";
int szOfNewStr = newStr.size();
int center = ;
int len = ;
for(int i = ; i < szOfNewStr; i++)
{
int step = ;
int k = i;
int tmpCenter = i;
int tmpHalfLen = ;
int tmpLen = ;
if(newStr[i] == '#')
{
while(k - step > - && k + step < szOfNewStr && newStr[k - step] == newStr[k + step])
{
tmpHalfLen++;
step += ;
}
tmpLen = * tmpHalfLen;
}
else
{
step++;
while(k - step > - && k + step < szOfNewStr && newStr[k - step] == newStr[k + step])
{
tmpHalfLen++;
step += ;
}
tmpLen = * tmpHalfLen + ;
}
if(tmpLen > len)
{
len = tmpLen;
center = tmpCenter;
}
}
string retStr;
if(newStr[center] == '#')
{
int i = ;
while(i < len)
{
retStr.insert(retStr.begin(), newStr[center - i]);
retStr.insert(retStr.end(), newStr[center + i]);
i += ;
}
}
else
{
retStr += newStr[center];
int i = ;
while(i < len)
{
retStr.insert(retStr.begin(), newStr[center - i]);
retStr.insert(retStr.end(), newStr[center + i]);
i += ;
}
}
return retStr;
}
};
另外,代码已托管至Github.
LeetCode之“字符串”:最长回文子串的更多相关文章
- 每日一道 LeetCode (48):最长回文子串
每天 3 分钟,走上算法的逆袭之路. 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub: https://github.com/meteor1993/LeetCode Gitee ...
- LeetCode Golang 5. 最长回文子串
5. 最长回文子串 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: "bab&quo ...
- 【LeetCode】5# 最长回文子串
题目描述 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: "bab" 注意 ...
- python刷LeetCode:5. 最长回文子串
难度等级:中等 题目描述: 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad"输出: "bab& ...
- Manacher算法讲解——字符串最长回文子串
引 入 引入 引入 Manachar算法主要是处理字符串中关于回文串的问题的,这没什么好说的. M a n a c h e r 算 法 Manacher算法 Manacher算法 朴素 求一个字符串中 ...
- leetcode题目5.最长回文子串(中等)
题目描述: 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad"输出: "bab"注意: ...
- leetcode 5/300 最长回文子串 py
目录 题目说明 方法一:动态规划--状态转移方程 方法二:优化中心扩展算法 题目说明 要看明白求得是什么,最长回文字串是指例如cababa中ababa是最长的,不是求回文的部分aba 方法一:动态规划 ...
- 【LeetCode 5】 最长回文子串
题目链接 描述 [题解] 一个讲得比较好的博客地址; 感觉manacher算法的大概思路就是利用回文串左右对称的性质. 利用之前算出来的以某个点为中心的回文串.而当前要枚举的串被包括在其中. 则可以用 ...
- LeetCode之“字符串”:最短回文子串
题目链接 题目要求: Given a string S, you are allowed to convert it to a palindrome by adding characters in f ...
- POJ 3974 Palindrome(最长回文子串)
题目链接:http://poj.org/problem?id=3974 题意:求一给定字符串最长回文子串的长度 思路:直接套模板manacher算法 code: #include <cstdio ...
随机推荐
- 【DevOps敏捷开发动手实验】开源文档 v2015.2 stable 版发布
Team Foundation Server 2015 Update 2版本终于在2周前的//Build 2016大会上正式发布了,借这个东风,小编也完成了[DevOps敏捷开发动手实验]开源文档的第 ...
- tf.app.run()
在很多TensorFlow公布的Demo中,都有这样的代码存在,如下,这是干什么的呢? if __name__ == "__main__": tf.app.run() 我们来看一下 ...
- C库源码中的移位函数
#include <stdio.h> /* _lrotr()将一个无符号长整形数左循环移位的函数 原形:unsigned long _lrotr(unsigned long value,i ...
- [Python]程序性能分析
有些脚本发现比预期要慢的多,就需要找到瓶颈,然后做相应的优化,参考A guide to analyzing Python performance,也可以说是翻译. 指标 运行时间 时间瓶颈 内存使用 ...
- 【Android 应用开发】 FastJson 使用详解
博客地址 :http://blog.csdn.net/shulianghan/article/details/41011605 fastjson 源码地址 : -- GitHub : https:// ...
- 多重DES
背景:单重DES在穷举攻击下相对比较脆弱 理论依据:以双重DES为例 加密:C = E(K2,E(K1,P)) 解密:P = D(K1,D(K2,C)) 要证明多重加密有效,就要证明不存在K3 ...
- leetcode 生成杨辉三角形, 118 119 Pascal's Triangle 1,2
Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5, Retu ...
- Oracle Instance
以前也学习过oracle 逻辑结构的知识,但用的不多好多都是有点概念,最近做到一个跨instance工作流,所有抽点时间温习了一下相关知识,把网上看到的感觉讲的还比较明了,全面的文章汇总一下 inst ...
- (NO.00002)iOS游戏精灵战争雏形(六)
接下来我们给MainScene场景再添加一个精灵,作为敌人. 双击SpriteBuilder中的MainScene.ccb,从控件库拖入一个CCSprite到CCPhysicsNode中,设置精灵帧为 ...
- WdatePicker()时间控制方式(转载+原创)
控制时间在制定范围内: <input class="wzsrk" name="startDateStr" id="startDateStr ...