5. 最长回文子串
题目:给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:
输入: "cbbd"
输出: "bb"
代码:
暴力法: 超时
class Solution {
public String longestPalindrome(String s) {
int len=s.length();
int left=0,right=0;
int count1=0 ,count2=0;
int k=0;
if(len0||len1){
return s;
}
for(int i=0;i<len-1;i++){
if(s.charAt(i)s.charAt(i+1)){
count2=2;
left=i-1;
right=i+2;
while(left>=0&&right<len){
if(s.charAt(left)s.charAt(right)){
left--;
right++;
count2+=2;
}
}
if(count1<count2){
count1=count2;
k=left+1;
}
}
else{
count2=1;
left=i-1;
right=i+1;
while(left>=0&&right<len){
if(s.charAt(left)==s.charAt(right)){
left--;
right++;
count2+=2;
}
}
if(count1<count2){
count1=count2;
k=left+1;
}
}
}
return s.substring(k,k+count1) ;
}
}
解法二: 极度低效
代码:
class Solution {
public String longestPalindrome(String s) {
int len =s.length();
if(len==1||len==0){ //空串和长度为1直接返回
return s;
}
int[][] str_len=new int[len][len];
for(int i=0;i<len;i++){ //初始化
for(int j=0;j<len;j++){
str_len[i][j]=-1;
}
str_len[i][i]=1; //字串长为1,必是回文串
}
for(int i=0;i<len;i++){ //初始化
for(int j=i+1;j<len;j++){
if(str_len[i][j]<0){
fun( s, i, j, str_len);
}
}
}
fun( s, 0, len-1, str_len);
//找出最长回文子串
int temp=1,k=0;
for(int i=0;i<len;i++){ //初始化
for(int j=i+1;j<len;j++){
if(str_len[i][j]>temp){
k=i;
temp=str_len[i][j];
}
}
}
return s.substring(k,k+temp);
}
public static void fun(String s,int i,int j,int[][] str_len) {
int k=0,maxlen=1;
if(i==j){
return ;
}
if(j==i+1){ //字串长为2单独处理
str_len[i][j]=(s.charAt(i)==s.charAt(j))?2:0;
return;}
if(str_len[i+1][j-1]==-1){
fun( s,i+1, j-1, str_len);
}
if(str_len[i+1][j-1]>0&&(s.charAt(i)==s.charAt(j))) {
str_len[i][j]=str_len[i+1][j-1]+2;
}
else{
str_len[i][j]=0;
}
}
}
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术