leetcode刷题记录第五题
题目:
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:
输入: "cbbd"
输出: "bb"
什么叫回文串?
如果一个字符串正着读和反着读是一样的,那它就是回文串。
此题有暴力破解法,即遍历所有子串来进比较,效率太低,比较优秀的解法有中心扩展法,动态规划法和“马拉车”法。我使用的是中心扩展法来进行解题。
解法如下:
class Solution {
public:
int getStr(string &s, int left, int right)
{
// 计算以left和right为中心的回文串长度
while(left>=0 && right<s.length() && s[left] == s[right])
{
left --;
right ++;
}
return right - left - 1;
}
string longestPalindrome(string s) {
int len = s.length();
if(len == 0 || len == 1)
return s;
int start = 0;
int end = 0;
int mlen = 0;
for(int i=0;i<len -1;i++)
{
int num1 = getStr(s,i,i);
//一个元素为中心 int num2 = getStr(s,i,i+1);//两个元素的空隙为中心
mlen=max(max(num1,num2),mlen);
if(mlen>end-start+1)
{
start=i-(mlen-1)/2;//起点就是传入的这个点往左扩展的次数
end=i+mlen/2;
}
}
return s.substr(start,mlen);
}
};
中心扩展法的思路就是选中一个点,然后分别向两边扩展,直到左右两边扩展的字符不相等,返回总共扩展了的长度。

浙公网安备 33010602011771号