题目大意:
给定一个字符串,使用替换字符,增加字符和删除字符三种操作使得字符串变成回文,求出最少的操作次数。
解题思路:
动态规划题目,题中的增加字符和删除字符的操作本质上是一样的,可以都理解为增加字符。
设dp[i][j] 表示字符串第 i 个字符到第 j 个字符是回文所需操作的次数,则假设第 i+1 到 j-1 的字符是回文了,那么第 i 个字符和第 j 个字符就有两种情况,一种是相等,则 dp[i][j] = dp[i+1][j-1], 即不用操作;另外一种是不相等,那么就得增加一次操作,操作的方式有三种: dp[i+1][j],dp[i][j-1] 和 dp[i+1][j-1], 第一种表示在第 i 个字符那里增加一个和 j 相同的字符, 第二种表示在 j-1 那里增加一个和 i 相同的字符, 第三种就是删除该字符,状态回到 dp[i+1][j-1],所以状态转移方程就是 :
dp[i][j] = min( dp[i+1][j], min(dp[i][j-1], dp[i+1][j-1] ) ) + 1;
从三种操作中选取最小的一个,然后加 1。
代码如下:
#include <iostream> #include <cstring> using namespace std; int dp[1010][1010]; char s[1010]; int main() { int T, len; cin>>T; for( int k = 1; k <= T; k++ ) { cin>>s; len = strlen(s); memset( dp, 0, sizeof( dp ) ); for( int i = len-1; i >= 0; i-- ) { for( int j = i+1; j < len; j++ ) { if( s[i] == s[j] ) dp[i][j] = dp[i+1][j-1]; else { dp[i][j] = min( dp[i+1][j], min(dp[i][j-1], dp[i+1][j-1] ) ) + 1; } } } cout<<"Case "<<k<<": "<<dp[0][len-1]<<endl; } return 0; }
相关推荐
Determine whether an integer is a palindrome. Do this without extra space. Java AC版本
北大POJ1159-Palindrome 解题报告+AC代码
转变为字符串回文的次数--java-easy- 给定字符串输入,程序将打印回文所需的班次数。 移位是在字符串的一端删除或插入一个字符,然后将其插入到字符串的另一端。 输入格式: 第一行-输入的字符串数为n。...
C++实现的Palindrome,回文 C++实现的Palindrome,回文
各位帮帮忙吧
Pku acm 第1159题 Palindrome 代码,有详细的注释,动态规划
Given a 2-D array of N rows and M columns, your task is to find a maximum sub-array of P rows and P columns, of which each row and each column is a palindrome sequence. Input The first line of ...
回文数Java
palindrome22.in
北大POJ1159-Palindrome
LeetCode Palindrome Number解决方案
palindrome_prime.c
回文探测器通过遵循迈克尔·哈特尔... String类的方法,可以如下使用: $ irb>> require 'bencreating_palindrome'>> "honey badger".palindrome?=> false>> "deified".palindrome?=> true>> "Able was I, ere I
GET /java-palindrome-example/palindrome/<string> 解析提供的字符串,并找到其中包含的最大回文。 在此情况下,也可以将type的可选查询参数设置为slow在这种情况下,服务将使用慢得多的递归算法。 例子 GET /java...
Palindrome.py
检查字符串是否为palindrome, 从前后分别检查,并计算出相同或不同的数量。
palindrome number in c
palindrome(STACK,QUEUE).cpp
JAVA程序 Palindrome.java 输入任何字母数字组合 检查是否是回文结构? 例:abccba 从左往右看 和 从右往左看一样 为回文结构 包括检查是否带标点符号 检查是否有空格 如a bccba 输入带空格 仍为回文结构