zoukankan      html  css  js  c++  java
  • 腾讯笔试题 构造回文(LCS问题)

    给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?
    输出需要删除的字符个数。


    输入描述:

    输入数据有多组,每组包含一个字符串s,且保证:1<=s.length<=1000.


    输出描述:

    对于每组数据,输出一个整数,代表最少需要删除的字符个数。


    输入例子1:
    abcda
    google
    

    输出例子1:
    2
    2
    
    分析:
    要求删掉字符最少,也就是最长的回文串,回文串的性质是正反读起来一样,
    所以我们将当前字符串逆反得到一个新的字符串,
    然后求得这两个字符串的最长公共子序列的长度
    然后字符串的总长度减去最长公共子序列的长度,就是最少需要删除的字符的个数

    code:
    #include<bits/stdc++.h>
    using namespace std;
    #define max_v 1005
    #define me(a,x) memset(a,x,sizeof(a))
    typedef long long LL;
    int dp[max_v][max_v];//dp[i][j]表示a0.....ai和b0....bj的LCS长度
    char a[max_v],b[max_v];
    int main()
    {
        while(~scanf("%s",a))
        {
            int n=strlen(a);
            for(int i=n-1,k=0;i>=0;i--)
            {
                b[k++]=a[i];//得到原串的逆反串
            }
            me(dp,0);
            for(int i=1;i<=n;i++)
            {
                for(int j=1;j<=n;j++)
                {
                    if(a[i-1]==b[j-1])//因为i,j是从1开始的,所以i-1,j-1
                    {
                        dp[i][j]=dp[i-1][j-1]+1;
                    }else
                    {
                        dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
                    }
                }
            }
            cout<<n-dp[n][n]<<endl;
        }
        return 0;
    }
  • 相关阅读:
    Flutter图片选择 image_picker(官方)插件使用详解
    androidstudo如何跨越这个厚厚的墙,亲测有效 Could not resolve com.android.tools.build:gradle:
    qwq。。胡诌qwq
    关于很狗的军训qwq
    Leetcode每日一题 503.下一个更大元素II
    C++ 关于volatlie
    C++虚成员函数与动态联编
    graphics pipeline
    pointer or function
    线段树
  • 原文地址:https://www.cnblogs.com/yinbiao/p/10500927.html
Copyright © 2011-2022 走看看