1.暴力法
#include "回文数.hpp"
#include <iostream>
#include <string.h>
#include <vector>
using namespace std;
class Solution
{
private:
bool valid (string s,int left,int right)
{
//判断子串数s[left,ringht]是否为回文串
while(left < right)
{
if(s[left] != s[right])
{
return false;
}
//左边++,右边--
left++;
right--;
}
return true;
}
public:
string longestPalindrome(string s)
{
//判断
int size = s.size();
if( size < 2 )
{
return s;
}
//定义
int maxlen =1;
//获得字符串s中 从第0位开始的长度为1的字符串
string res = s.substr(0, 1);
//遍历
for(int i=0;i<size -1;i++)
{
for(int j = i+1;j<size-1;j++)
{
if(j-i+1 >maxlen && valid(s,i,j))
{
maxlen = j-i+1;
res = s.substr(i, maxlen);
}
}
}
return res;
}
};
时间复杂度:O(N3)
空间复杂度:O(1)
2.中心扩散法
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class Solution {
private:
string centerSpread(string s, int left, int right) {
// left = right 的时候,此时回文中心是一个空隙,回文串的长度是奇数
// right = left + 1 的时候,此时回文中心是任意一个字符,回文串的长度是偶数
int size = s.size();
int i = left;
int j = right;
while (i >= 0 && j < size) {
if (s[i] == s[j]) {
i--;
j++;
} else {
break;
}
}
// 这里要小心,跳出 while 循环时,恰好满足 s.charAt(i) != s.charAt(j),因此不能取 i,不能取 j
return s.substr(i + 1, j - i - 1);
}
public:
string longestPalindrome(string s) {
// 特判
int size = s.size();
if (size < 2) {
return s;
}
int maxLen = 1;
string res = s.substr(0, 1);
// 中心位置枚举到 len - 2 即可
for (int i = 0; i < size - 1; i++) {
string oddStr = centerSpread(s, i, i);
string evenStr = centerSpread(s, i, i + 1);
string maxLenStr = oddStr.size() > evenStr.size() ? oddStr : evenStr;
if (maxLenStr.length() > maxLen) {
maxLen = maxLenStr.size();
res = maxLenStr;
}
}
return res;
}
};