1040 Longest Symmetric String (25 分)(动态规划:最长回文)

该博客介绍了一种利用动态规划方法来判断字符串中是否存在回文子串的算法。代码实现中,首先初始化了二维dp数组,并通过双重循环检查不同长度的子串。当子串长度大于等于3时,通过比较首尾字符并结合dp[i+1][j-1]的状态来更新dp[i][j]。最终输出最长回文子串的长度。

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

题目链接

思路

上一篇
判断完这些问题
需要确定从哪里开始写状态方程
可以确保无后效性
拍脑门一想
除了长度为2,长度为1的子串没法通过状态方程推出
3及3以上的都可以
满足
代码中
dp[i][j]表示下标为i到j的字符串是否回文
则在子串长度≥3时
可以通过dp[i+1][j-1]对dp[i][j]进行推导

代码

using namespace std;
#include <iostream>
#include<string>
int dp[1010][1010], ans = 1;
int main() {
	string s;
	getline(cin, s);
	for (int i = 0; i < s.size(); i++) {
		dp[i][i] = 1;
		if (i + 1 <= s.size() - 1&&s[i]==s[i+1]) {
			ans = 2;
			dp[i][i + 1] = 1;
		}
	}
	for (int l = 3; l <= s.size(); l++) {
		for (int i = 0; i <= s.size() - l; i++) {
			int j = i + l - 1;
			if (s[i] == s[j] && dp[i + 1][j - 1] == 1) {
				dp[i][j] = 1;
				ans = l;
			}
		}
	}
	cout << ans;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值