编程之美资格赛——题目2 : 回文字符序列

时间限制: 2000ms
单点时限: 1000ms
内存限制: 256MB

描述

给定字符串,求它的回文子序列个数。回文子序列反转字符顺序后仍然与原序列相同。例如字符串aba中,回文子序列为"a", "a", "aa", "b", "aba",共5个。内容相同位置不同的子序列算不同的子序列。

输入

第一行一个整数T,表示数据组数。之后是T组数据,每组数据为一行字符串。

输出

对于每组数据输出一行,格式为"Case #X: Y",X代表数据编号(从1开始),Y为答案。答案对100007取模。

数据范围

1 ≤ T ≤ 30

小数据

字符串长度 ≤ 25

大数据

字符串长度 ≤ 1000


样例输入
5
aba
abcbaddabcba
12111112351121
ccccccc
fdadfa
样例输出
Case #1: 5
Case #2: 277
Case #3: 1333
Case #4: 127
Case #5: 17

分析:

这题可以使用区间动态规划法。

首先考虑怎么样定义dp让它满足具有通过子结构来求解。

用dp(i,j)代表字符串中位置i到位置j之间的回文字符串个数。


找到状态转移方程式:

考虑字符串:a????a 这种情况,i,j分别是头尾两个a,则d(i,j) = d(i+1,j-1)+ 1

对于任意一个字符串,比如abcd,只要知道a+子字符串bcd中的回文和子字符串abc中的回文数+d,bc字符串计算了两遍,所以需要减去一个,则d(i,j)= d(i+1,j)+d(i,j-1)-d(i+1,j-1)

于是就将长字符串,依赖于短字符串中的回文个数。通过上面那两个状态转移方程式。就可以得出最终长字符串的回文个数。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值