Longest Palindromic Substring--LeetCode

本文探讨了如何在给定字符串中找到最长的回文子串,并提供了两种思路:一种是通过中心点向外扩展,另一种是在考虑相邻字符作为回文子串的基础上进行优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.
思路:第一种思路,就是以某个元素为中心点开始两边遍历,遍历最长的为最长的回文字符串。其实查找回文字符串的最佳方法是后缀树,后缀树是最佳的方法。
#include <iostream>
#include <string> 
#include <vector>
using namespace std;
/*
一个字符串中最长的回文子串 
思路:以某一个字符为中心开始向两边遍历 这样查找最长的子串 
*/
int LongestPalindromicSub(string& str)
{
	int pre,next,i;
	int maxlen=0;
	int pos;
	for(i=0;i<str.length();i++)
	{
		pre =i-1;
		next = i+1;
		while(pre>=0 && next<str.length())
		{
			if(str[pre] == str[next])
			{
				pre--;
				next++;
			}
			else
				break;
		}
		if(maxlen < (i-pre)*2+1)
		{
			maxlen = next-pre-1;
			pos = pre+1;
		}
			
	}
//	cout<<pos<<endl;
	return maxlen;
} 
int main() 
{
	string str("ADOEBEOODEBEDCAAACDABDDBDAD");
	cout<<LongestPalindromicSub(str)<<endl;
	return 0;
}


思路:其实上面的这个思路有一点缺陷,没有考虑第i个字符和第i+1个字符作为回文的子串,这里需要将这种情况考虑在内
int LongestPalindromicSub(string& str)  
{  
    int pre,next,i;  
    int maxlen=0;  
    int pos;  
    for(i=0;i<str.length();i++)  
    {  
        pre =i-1;  
        next = i+1;  
        while(pre>=0 && next<str.length())  
        {  
            if(str[pre] == str[next])  
            {  
                pre--;  
                next++;  
            }  
            else  
                break;  
        }  
        if(maxlen < (i-pre)*2+1)  
        {  
            maxlen = next-pre-1;  
            pos = pre+1;  
        }  
        if(str[i] == str[i+1] && i+1 <str.length())
		{
			pre = i-1;
			next = i+2;
			while(pre>=0 && next<str.length())  
        	{  
            	if(str[pre] == str[next])  
            	{  
                	pre--;  
                	next++;  
            	}  
            	else  
                	break;  
        	}  
        	if(maxlen < (i-pre)*2+1)  
        	{  
            	maxlen = next-pre-1;  
            	pos = pre+1;  
        	}  
		} 	         
    }  
    return maxlen;  
}   



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值