zoukankan      html  css  js  c++  java
  • 51 Nod 1092 回文字符串

    1092 回文字符串 

    基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题

     收藏

     关注

    回文串是指aba、abba、cccbccc、aaaa这种左右对称的字符串。每个字符串都可以通过向中间添加一些字符,使之变为回文字符串。

    例如:abbc 添加2个字符可以变为 acbbca,也可以添加3个变为 abbcbba。方案1只需要添加2个字符,是所有方案中添加字符数量最少的。

    Input

    输入一个字符串Str,Str的长度 <= 1000。

    Output

    输出最少添加多少个字符可以使之变为回文字串。

    Input示例

    abbc

    Output示例

    2

    思路:

    最坏的情况就是在原字符串的右边添加该字符串的倒序字符串咯,长度为a.size(),不难想到原字符串和其倒序字符串可能存在公共子序列,公共子序列含有的字符我们是不需要添加的(因为两边原本就有嘛).我们要使添加的字符最少,那么就是找到最大的公共子序列,再用a.size()减去公共子序列含有的字符数目就好啦,即:

    ans=a.size()-lcs(a, b), 其中b为a的倒序字符串;

    #include <bits/stdc++.h>
    #define MAXN 1010
    using namespace std;

    int dp[MAXN][MAXN];

    int main(void){
        string a, b;
        cin >> a;
        b=a;
        reverse(b.begin(), b.end());
        int len=a.size();
        for(int i=0; i<len; i++){
            for(int j=0; j<len; j++){
                if(a[i]==b[j]){
                    dp[i+1][j+1]=dp[i][j]+1;
                }else{
                    dp[i+1][j+1]=max(dp[i+1][j], dp[i][j+1]);
                }
            }
        }
        cout << len-dp[len][len] << endl;
    }

  • 相关阅读:
    Python中的memoryview
    Python常见陷阱
    特殊方法 之 len __repr__ __str__
    collections模块
    使用math中的hypot实现向量
    Ellipsis对象
    array
    标准库heapq的使用
    Mysql常用命令
    使用npm查看安装的包
  • 原文地址:https://www.cnblogs.com/linruier/p/9738086.html
Copyright © 2011-2022 走看看