https://www.dotcpp.com/oj/problem1200.html 算法复杂度O(n)
问题 1200: 回文串
时间限制: 1Sec 内存限制: 128MB 提交: 715 解决: 361
题目描述
回文串是从左到右或者从右到左读起来都一样的字符串,试编程判别一个字符串是否为回文串。
输入
输入一个字符串。串长度<255.
输出
判别输入的字符串是否为回文串,是输出"Y",否则输出"N"。
样例输入
abcba
样例输出
Y
#include<iostream>
#include<cstdio>
using namespace std;
int main(){
string s;
int f=0;
cin>>s;
int len = s.size();
//printf("%d",len);
if(len==1) {
printf("Y");
return 0;
}
int t=len-1;
for(int i=0;i<len/2;++i,t--)
{
if(s[i]!= s[t])
{
f=1;
// cout<<s[i]<<s[t]<<i<<t<<endl;
break;
}
}
if(f==1) printf("N");
else printf("Y");
return 0;
}
https://leetcode-cn.com/problems/longest-palindromic-substring/
难度中等799收藏分享切换为英文
通过次数
52,406
提交次数
210,711
给定一个字符串
s
,找到s
中最长的回文子串。你可以假设s
的最大长度为 1000。示例 1:
输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案。示例 2:
输入: "cbbd" 输出: "bb"
DP算法O(n^2)
class Solution {
public:
string longestPalindrome(string s) {
if(s.size()<2) return s;
int len=0,left=0,right=0;
int dp[s.size()][s.size()]={0};
for(int i=0;i<s.size();++i){
for(int j=0;j<i;++j){
dp[j][i]=(s[i]==s[j] && (dp[j+1][i-1] || i-j<2));
if(dp[j][i] && len<i-j+1){
len=i-j+1;
left=j;
right =i;
}
}
dp[i][i]=1;
}
return s.substr(left,right-left+1);
}
};
还没彻底弄明白 复杂度为O(n) 以及大名鼎鼎的Manacher 算法