zoukankan      html  css  js  c++  java
  • 【又见LCS】NYOJ-37 回文字符串

    题目链接

    回文字符串

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

    【思路】

      由之前做过的几题LCS,不难看出,这道题的答案就是,将输入的字符串与其反转后的字符串求两者的LCS,然后字符串长度-LCS值便是答案。

      LCS博客连接

     1 #include<iostream>
     2 #include<cstring>
     3 using namespace std;
     4 #define max(a,b) a > b ? a : b
     5 const int maxn = 1001;
     6 int dp[maxn][maxn];
     7 char s1[maxn],s2[maxn];
     8 int main(){
     9     int n;
    10     cin >> n;
    11     while(n--){
    12         int i,j;
    13         cin >> s1;
    14         int len = strlen(s1);
    15         for(i = len - 1,j = 0;i >= 0;i--,j++)
    16             s2[j] = s1[i];        
    17         for(i = 1;i <= len;i++){
    18             for(j = 1;j <= len;j++){
    19                 if(s1[i - 1] == s2[j - 1]){
    20                     dp[i][j] = dp[i - 1][j - 1] + 1;
    21                 }
    22                 else
    23                     dp[i][j] = max(dp[i][j - 1],dp[i - 1][j]);
    24             }
    25         }
    26         cout << len - dp[len][len] << endl;
    27     }
    28     return 0; 
    29 }
    30  

     【注意】

      本来这题应该一次水过的,但是提交编译错误了1次,原因是一个代码中同时用了 scanf 与 cin,cout,同时用编译器不会报错,但是往往忘记加两者不同的头文件,所以以后要注意这个,尽量统一用一种输入输出的方法。

      不然,影响拿一血啊~

  • 相关阅读:
    《Redis内存数据库》Redis主复制集(主从复制)
    《Redis内存数据库》Redis消息模式
    《Redis内存数据库》redis配置文件说明
    《Redis内存数据库》Redis事务
    《Redis内存数据库》Redis持久化实现方式和原理
    《Redis内存数据库》Redis基本操作命令
    《Redis内存数据库》Redis权限管理
    yum install 与 yum groupinstall 的区别
    LNMP卸载
    Vim配置 终端背景色配置
  • 原文地址:https://www.cnblogs.com/zhengbin/p/4467697.html
Copyright © 2011-2022 走看看