poj 1159 Palindrome LCS一维滚动数组优化

博客介绍了如何解决poj 1159问题,即找到使字符串对称所需的最小添加字符数。通过将问题转换为求最长公共子串(LCS),并应用滚动数组优化,来降低空间复杂度。博主提供了LCS的递推公式和一维滚动数组的实现思路,以解决空间限制的问题。
摘要由CSDN通过智能技术生成

本题题意:给出一个长度为n的字符串,求添加最少的字符数目,使得该字符串为一个对称的字符串。

题解:
对于Ab3bd 而言,反向翻转得到bd3bA

A	b	3	b	d
b	d	3	b	A

求这两个字符串的最长公共子串,对于非公共子串的字符,则需要添加一个相同的字符使该字符串能够对称。
问题转化为求最长公共子串问题。
由于题目空间大小有限,一种做法是将dp方程以short定义;
另外方法是进行滚动数组优化。
下文给出LCS常规思路,以及一种优化方法

原题地址 http://poj.org/problem?id=1159

##最长公共子串问题LCS:
给出两个子串A,B, 如
A B C B D A B
B D C A B A
最长公共子串为4: BCBA
递推公式: dp(i,j)为A,B当前长度为i,j的LCS

dp(i,j)=dp(i-1,j-1)+1  while A[i]==B[j]
dp(i,j)=max(dp(i-1,j),dp(i,j-1))    while A[i]!=B[j]

1|2|2|3|i-1,j-1||i-1,j
-|-------|----------
| | | | ||↖+1|↑
1 | 2|3|4|i,j-1|←|i,j

可见dp(i,j)是依赖于上一行的2个值,当前行的1个值;
由于直接变成一维数组,会导致i-1,j-1被当前行替换,因此只需提前保存上一行的

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值