题目
Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.
Example:
Input: “babad”
Output: “bab”
Note: “aba” is also a valid answer.
Example:
Input: “cbbd”
Output: “bb”
思路
吃完饭难得和某爽约算法题,看到题目是最大回文子串,emmmm没做过,唯一有点印象就是大一学程序设计的时候做过判断是否是回文串的问题。判断不出这道题用不用动规,索性暴力,,,
总体思路是这样的:
从每个位置判断以该位置为中心点的时候最长回文子串的长度。
- 如果该位置的相邻字符均与之不同,直接往左右两个方向搜索直到不是回文串或者越界。
- 如果该位置的相邻字符与之相同,则进行整合,把相同的字符一整串看成一体,确定左边最小的座标与右边最大的座标,然后往左右两个方向搜索直到不是回文串或者越界。
代码
#include <iostream>
#include <string>
using namespace std;
class Solution {
public:
string longestPalindrome(string s) {
string lps = "";
int maxL=0; //记录最大回文子串长度
for(int i = 0;i < s.length();i++){
int left = i, right = i;
while(i+1 < s.length() && s[i]==s[i+1]){
right = i+1; //如果s[i]==s[i+1],更新right,即相同字符右边最大的座标
i++;
}
while(left>=0 && right<s.length() && s[left] == s[right]){
left--;right++; //判断不是回文串的情况
}
if(right-left-1 > maxL){
lps = s.substr(left+1, right-left-1); //提取当前最大回文子串
maxL = right-left-1;
}
}
return lps;
}
};
int main()
{
string temp;
cin >> temp;
Solution s = Solution();
cout << s.longestPalindrome(temp);
return 0;
}
想不到这种暴力做法居然过了,,,而且run time 6ms,,,写完blog某爽还没打完哈哈哈哈一包辣条到手Yeah! 时间复杂度O(n^2)的样子Orz