题目大意:
给定一个字符串,问在该字符串的所有子串中,有多少个是回文?
解题思路:
动态规划,设定 dp[i][j] 表示第 i 个字符到第 j 个字符里是回文的个数,设字符串为 s,则状态转移方程为:
(1)s[i] == s[j]
dp[i][j] = dp[i+1][j] + dp[i][j-1] - dp[i+1][j-1] + dp[i+1][j-1] + 1;
当s[i] == s[j]时,要考虑s[i+1]到s[j]的回文数加上s[i] 到s[j-1]的回文数,由于两者都算的s[i+1]到s[j-1]的回文数,所以要减去s[i+1]到s[j-1]的回文数,由因为s[i] == s[j], 所以s[i] 到 s[j]也是回文,所以又要加上s[i+1] 到 s[j-1]的回文数再加上1。
(2)s[i] != s[j]
dp[i][j] = dp[i+1][j] + dp[i][j-1] - d][i+1][j-1];
因为s[i] != s[j],则只要考虑s[i+1]到s[j]的回文数加上s[i] 到s[j-1]的回文数,由于两者都算的s[i+1]到s[j-1]的回文数,所以要减去s[i+1]到s[j-1]的回文数。
代码:
#include <iostream> #include <cstring> #include <algorithm> #include <vector> using namespace std; long long dp[65][65]; int main() { int T, m; cin>>T; while(T--) { char s[65]; cin>>s; m = strlen(s); memset( dp, 0, sizeof(dp) ); for(int i = 0; i < m; i ++) dp[i][i] = 1; //因为单独一个字符也是回文,所以要预先处理一下; for( int i = m-1; i >= 0; i-- ) { for( int j = i+1; j < m; j++ ) { if( s[i] == s[j] ) dp[i][j] = dp[i][j-1] + dp[i+1][j] + 1; else dp[i][j] = dp[i][j-1] + dp[i+1][j] - dp[i+1][j-1]; } } cout<<dp[0][m-1]<<endl; } return 0; }
相关推荐
Determine whether an integer is a palindrome. Do this without extra space. Java AC版本
北大POJ1159-Palindrome 解题报告+AC代码
C++实现的Palindrome,回文 C++实现的Palindrome,回文
Pku acm 第1159题 Palindrome 代码,有详细的注释,动态规划
各位帮帮忙吧
Palindrome Sub-Array,Problem Description A palindrome sequence is a sequence which is as same as its reversed order. For example, 1 2 3 2 1 is a palindrome sequence, but 1 2 3 2 2 is not. Given a 2-...
回文数Java
palindrome22.in
北大POJ1159-Palindrome
LeetCode Palindrome Number解决方案
palindrome_prime.c
Palindrome.py
检查字符串是否为palindrome, 从前后分别检查,并计算出相同或不同的数量。
GET /java-palindrome-example/palindrome/ 解析提供的字符串,并找到其中包含的最大回文。 在此情况下,也可以将type的可选查询参数设置为slow在这种情况下,服务将使用慢得多的递归算法。 例子 GET /java-...
palindrome number in c
palindrome(STACK,QUEUE).cpp
安装要安装bencreating_palindrome ,请将此行添加到应用程序的Gemfile : gem 'bencreating_palindrome'然后安装如下: $ bundle install或者直接使用gem安装它: $ gem install bencreating_palindrome用法...
JAVA程序 Palindrome.java 输入任何字母数字组合 检查是否是回文结构? 例:abccba 从左往右看 和 从右往左看一样 为回文结构 包括检查是否带标点符号 检查是否有空格 如a bccba 输入带空格 仍为回文结构
1-99999位数回文数判断,银行管理包括利率,密码,剩余额