【动态规划】回文字符串

【动态规划】回文字符串

时间限制: 1 Sec  内存限制: 128 MB

题目描述

所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如"aba"。当然,我们给你的问题不会再简单到判断一个字符串是不是回文字符串。现在要求你,给你一个字符串,可在任意位置添加字符,最少再添加几个字符,可以使这个字符串成为回文字符串。

输入

第一行给出整数N(0<N<100)
接下来的N行,每行一个字符串,每个字符串长度不超过1000.

输出

每行输出所需添加的最少字符数

样例输入

1
Ab3bd

样例输出

2

分析:求插入最少的字符使字符串变为回文字符串就是求输入字符串中的最大回文数长度然后用总长减去最大长度就是所求字符数dp[i][j]表示从输入字符串的第i个位置到第j个位置的最大长度if(c[i-1]==c[j-1])  dp[i][j]=dp[i-1][j-1]+1else  dp[i][j]=max(dp[i-1][j],dp[i][j-1]
 1 #include <iostream>
 2 #include <cstring>
 3 #include <algorithm>
 4
 5 using namespace std;
 6
 7 int n;
 8 char c[1111],d[1111];
 9 int dp[1111][1111];
10
11 int main()
12 {
13     while(cin>>n)
14     {
15         while(n--)
16         {
17             cin>>c;
18             int len=strlen(c);
19             memset(dp,0,sizeof(dp));
20             for(int i=0,j=len-1;i<len;i++,j--)
21                 d[j]=c[i];
22
23             for(int i=1;i<=len;i++)                 //dp[i][j]需要从0开始
24             {
25                 for(int j=1;j<=len;j++)
26                 {
27                     if(c[i-1]==d[j-1])              //c[i-1]  d[j-1]从0到len-1
28                         dp[i][j]=dp[i-1][j-1]+1;
29                     else
30                         dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
31                 }
32             }
33             cout<<len-dp[len][len]<<endl;
34         }
35     }
36     return 0;
37 }
 
时间: 2024-08-29 14:11:02

【动态规划】回文字符串的相关文章

nyist oj 37 回文字符串 (动态规划经典)

回文字符串 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如"aba".当然,我们给你的问题不会再简单到判断一个字符串是不是回文字符串.现在要求你,给你一个字符串,可在任意位置添加字符,最少再添加几个字符,可以使这个字符串成为回文字符串. 输入 第一行给出整数N(0<N<100) 接下来的N行,每行一个字符串,每个字符串长度不超过1000. 输出 每行输出所需添加的最少字符

Java Longest Palindromic Substring(最长回文字符串)

假设一个字符串从左向右写和从右向左写是一样的,这种字符串就叫做palindromic string.如aba,或者abba.本题是这种,给定输入一个字符串.要求输出一个子串,使得子串是最长的padromic string. 下边提供3种思路 1.两側比較法 以abba这样一个字符串为例来看,abba中,一共同拥有偶数个字.第1位=倒数第1位.第2位=倒数第2位......第N位=倒数第N位 以aba这样一个字符串为例来看,aba中.一共同拥有奇数个字符.排除掉正中间的那个字符后,第1位=倒数第1

回文字符串问题

回文字符串问题 一.动态规划法 定义boolean型的 p[i][j],为 Si 到 Sj 是否为回文,true 说明 Si 到 Sj 是回文字符串 则有,P[i,j] = (P[i + 1, j - 1] && Si ==Sj) 初始条件p[i, i] = true, p[i,i+1] = Si==Si+1 动态规划的思想是首先判断相邻的字符串是否是回文,然后继续判断连续的三个字符是否是回文,然后是四个,-,直到判断完整个字符串 时间复杂度O(n2),空间复杂度O(n2) 代码实现: p

nyoj 题目37 回文字符串

回文字符串 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如"aba".当然,我们给你的问题不会再简单到判断一个字符串是不是回文字符串.现在要求你,给你一个字符串,可在任意位置添加字符,最少再添加几个字符,可以使这个字符串成为回文字符串. 输入 第一行给出整数N(0<N<100)接下来的N行,每行一个字符串,每个字符串长度不超过1000. 输出 每行输出所需添加的最少字符数

1092 回文字符串

1092 回文字符串 回文串是指aba.abba.cccbccc.aaaa这种左右对称的字符串.每个字符串都可以通过向中间添加一些字符,使之变为回文字符串. 例如:abbc 添加2个字符可以变为 acbbca,也可以添加3个变为 abbcbba.方案1只需要添加2个字符,是所有方案中添加字符数量最少的. Input 输入一个字符串Str,Str的长度 <= 1000. Output 输出最少添加多少个字符可以使之变为回文字串. Input示例 abbc Output示例 2 动态规划,dp[i]

nyoj 回文字符串

回文字符串 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如"aba".当然,我们给你的问题不会再简单到判断一个字符串是不是回文字符串.现在要求你,给你一个字符串,可在任意位置添加字符,最少再添加几个字符,可以使这个字符串成为回文字符串. 输入 第一行给出整数N(0<N<100)接下来的N行,每行一个字符串,每个字符串长度不超过1000. 输出 每行输出所需添加的最少字符数

判断一个字符串是否为回文字符串

#include <stdio.h> #include <assert.h> #include <string.h> int is_pal_str(const char *p) {  assert(p);  int len = strlen(p);  const char *start = p;  const char *end = p+len - 1;  while (start < end)  {   if (*start == *end)   {    st

【LeetCode-面试算法经典-Java实现】【05-Longest Palindromic Substring(最大回文字符串)】

背景 近期開始研究算法,于是在leetcode上做算法题,第五题Longest Palindromic Substring便是关于回文子串的. 什么是回文字串 回文字符串是指将该字符串前后颠倒之后和该字符串一样的字符串.比如:a,aaaa,aba,abba- 最长回文子串 要求最长回文子串,就须要遍历每个子串,时间复杂度是O(N2):推断字串是不是回文,时间复杂度是O(N),这种话算法的时间复杂度就是O(N3). 我刚開始想到的就是中心扩展法,代码例如以下: public static Stri

判断是否是回文字符串(Java实现)

1.回文的定义:“回文数”就是正读倒读都一样的整数.如奇数个数字:98789,这个数字正读是98789 倒读也是98789.偶数个数字3223也是回文数.字母 abcba 也是回文. 2. 判断一个字符串是否是回文字符串(Java实现) 1 public class Test4 { 2 public static boolean isHuiWen(String text) { 3 int length = text.length(); 4 for (int i = 0; i < length /