难度中等
给你一个字符串 s
,找到 s
中最长的回文子串。
如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。
示例 1:
输入:s = "babad" 输出:"bab" 解释:"aba" 同样是符合题意的答案。
示例 2:
输入:s = "cbbd" 输出:"bb"
提示:
1 <= s.length <= 1000
s
仅由数字和英文字母组成
解题思路:
一、从和字符串长度一样的子串区间开始比较前后对应字母是否相同,如果不相同则跳出循环进入下一个子串区间。
注意:本题需要寻找最长回文子串,所以我们应该从最长的子串依次递减去匹配!
二、上一个子串区间不满足,则将区间缩小一,继续进行比对。
注意,小于原字符串长度的子串不唯一,必须从左到右按顺序依次遍历检查。
三、如果依旧没有找到匹配的回文子串,则继续缩小区间,知道找到为止
找到第一个匹配的子串(bab)后则输出此字符串!
注意:若一直找不到可以匹配的子串,则子串长度区间会缩小为1,此时将区间为1的第一个子串输出即可(如下图,子串a==a,符合匹配原则,输出)
本人通过代码如下(附注释):
#include<iostream> // 包含输入输出流头文件
#include<string> // 包含字符串相关头文件
using namespace std; // 使用命名空间std
class Solution { // Solution类
public:
string longestPalindrome(string s) { // 计算最长回文子串的函数
int len=s.length(); // 字符串s的长度
for(int n=len;n>0;n--){ // 从字符串s的长度开始,逐渐缩小到1
for(int i=0;i<len-n+1;i++){ // i表示子串的左端点,范围是[0, len-n]
int flag=1; // flag表示当前子串是否为回文串
for(int j=i,k=i+n-1;j<=k;j++,k--){ // 判断子串是否为回文串
if(s[j]!=s[k]){ // 如果不是回文串,则标记flag为0并跳出循环
flag=0;
break;
}
}
if(flag==1){ // 如果子串是回文串,则返回该子串
return s.substr(i,n);
}
}
}
return ""; // 如果找不到回文串,则返回空字符串
}
};
int main(){ // 主函数
Solution sol; // 创建Solution类的对象sol
string s; // 定义字符串s
cin>>s; // 从标准输入流中读入字符串s
cout<<sol.longestPalindrome(s); // 输出最长回文子串
return 0; // 返回0表示程序正常结束
}