求最大回文子串长度的一种方法(非最优,时间复杂度为O(N^2))

本文介绍了两种寻找字符串中最长回文子串的算法实现。第一种算法通过遍历字符串中心,分别检查奇数和偶数长度的回文情况;第二种算法采用双指针法,从中心向两边扩散,检查奇数和偶数长度的回文子串。两种算法均能有效找出最长的回文子串。

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

#include "iostream"
#include "string"
#include "sstream"
#include "vector"
#include "algorithm"
using namespace std;

int LongestPalindrome1(string s, int n)
{
	int i, j, max, c;
	if (s =="" || n < 1)
		return 0;
	max = 0;

	for (i = 0; i < n; ++i) { // i is the middle point of the palindrome  
		for (j = 0; (i - j >= 0) && (i + j < n); ++j) { // if the length of the palindrome is odd  
			if (s[i - j] != s[i + j])
				break;
			c = j * 2 + 1;
		}
		if (c > max)
			max = c;
		for (j = 0; (i - j >= 0) && (i + j + 1 < n); ++j) { // for the even case  
			if (s[i - j] != s[i + j + 1])
				break;
			c = j * 2 + 2;
		}
		if (c > max)
			max = c;
	}
	return max;
}
int LongestPalindrome2(string str)
{
	int length = 0;
	int max_len = 0;
	int left = 0; int right = 0;
	for (int i = 0; i < str.length(); i++)
	{
		//回文长度为奇数
		length = 1;
		left = i - 1;
		right = i + 1;
		while (left >= 0 && right < str.length() && str[left] == str[right])
		{
			length += 2;
			left--;
			right++;
		}
		if (length > max_len)
		{
			max_len = length;
		}
		//回文长度为偶数
		length = 0;
		left = i;
		right = i + 1;
		while (left >= 0 && right < str.length() && str[left] == str[right])
		{
			length += 2;
			left--;
			right++;
		}
		if (length > max_len)
			max_len = length;
	}
	return max_len;
}
int main()
{
	string str = "";

	while (getline(cin, str))
	{
		int max_len =  LongestPalindrome2(str);
		
		cout << max_len << endl;
	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值