1159 Palindrome(最小插入回文串)

简介:

标题效果

定的字符串长度的串和内容。中的字符可以在任何位置被插入。它至少需要为数字,这使得编程回文串串.

回文序列从左至右,从右到左和读取相同.

例如.

aaaacbbbb它是一个回文串

aaab前面插入b使得原串变为baaab这个回文串

我的思路.

1.假设该串为空串,或者长度为一。该串是回文串.

2.假设有字符串,a[o...n-1],(0<=l,r<n)假设从l-r之

        1可能是l-r对称回文(假设a[l]==a[r]),在匹配[l+1,r-1]这个串

        2.l,给r处加入字a[l]和l位置匹配,在匹配[l,r-1]这个串

        3l处加入字符a[r],和r位置匹配。在匹配[l+1,r]这个串

3.用以上方法加上备忘录d[l][r]来记录算过的串的最少插入数目

d[l][r]记录从l...r匹配插入的最少字符。问题d[0][n-1]

if(a[l]==a[r]) dd[l][r]=d[l+1][r+1];

else dd[l][r]=max(dd[l+1][r],dd[l][r-1])+1;

备忘录开成short。否则内存超,

险过得的代码.

/*Source Code
Problem: 1159		User: 
Memory: 49652K		Time: 1782MS
Language: GCC		Result: Accepted

Source Code*/

    /*插入最少的数字是原来数组成回文串*/
    #include <stdio.h>
    #include <string.h>
    short dd[5001][5001];
    char str[5002]="";
    int min(int a,int b) {
            return a<b?a:b;
    }
    int f(int l,int r){
            if(l>=r) return 0;
            else if(dd[l][r]>=0) return dd[l][r];//已经计算出来答案
            else{
                    if(str[l]==str[r]) 
                            dd[l][r]=f(l+1,r-1);
                    else
                            dd[l][r]=min(f(l+1,r),f(l,r-1))+1;
                    return dd[l][r];
            }
    }
    int main(){
            int n;
            scanf("%d",&n);
            scanf("%s",str);
            memset(dd,-1,sizeof(dd));
            printf("%d\n",f(0,n-1));
            return 0;
    }




版权声明:本文博主原创文章。博客,未经同意不得转载。







本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/4882164.html,如需转载请自行联系原作者


相关文章
|
5月前
【Leetcode 2645】构造有效字符串的最小插入数 —— 动态规划
状态定义:`d[i]`为将前 i 个字符拼凑成若干个 abc 所需要的最小插入数。状态转移方程: 如果` word[i]>word[i−1]`,那么`word[i]`可以和`word[i−1]`在同一组 abc 中,`d[i]=d[i−1]−1` ;否则`word[i]`单独存在于一组 abc 中,`d[i]=d[i−1]+2`
|
5月前
|
C++
两种解法解决LCR 008. 长度最小的子数组【C++】
两种解法解决LCR 008. 长度最小的子数组【C++】
|
5月前
|
测试技术 Perl
【动态规划】【记忆化搜索】【回文】1312让字符串成为回文串的最少插入次数
【动态规划】【记忆化搜索】【回文】1312让字符串成为回文串的最少插入次数
|
11月前
Palindromes(判断回文串)
Palindromes(判断回文串)
42 0
|
人工智能 算法
51nod 1202 子序列个数 (不重复子序列个数)
51nod 1202 子序列个数 (不重复子序列个数)
84 0
51nod 1255 字典序最小的子序列 (贪心 + stack)
51nod 1255 字典序最小的子序列 (贪心 + stack)
81 0
51nod 1292 字符串中的最大值 V2 (后缀数组)
51nod 1292 字符串中的最大值 V2 (后缀数组)
52 0
1312. 让字符串成为回文串的最少插入次数
1312. 让字符串成为回文串的最少插入次数
1312. 让字符串成为回文串的最少插入次数
[路飞]_leetcode-1312-让字符串成为回文串的最少插入次数
leetcode-1312-让字符串成为回文串的最少插入次数