2017百度校园招聘编程题 删除字符构造最长回文字符串(求最长公共子序列的变种)
2017-03-24 14:55
393 查看
题目
给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢? 输出需要删除的字符个数
输入描述
输入数据有多组,每组包含一个字符串s,且保证:1<=s.length<=1000.
输出描述
对于每组数据,输出一个整数,代表最少需要删除的字符个数。
输入例子
abcda
输出例子
2 2
思路
回文串就是正着读和反着读是一样的。题目的意思等价于求字符串和他的逆转字符串的最大公共子序列LCS(DP经典问题之一),如果你想用暴力,我劝你别,复杂度是指数级别的。求出LCS后,用字符串长度减去LCS长度即可。
代码
#include <iostream> #include <algorithm> #include <string> #include <cstring> using namespace std; int lcs[1001][1001]; int maxLcs(string& s1,string& s2) { int n=s1.length(); int m=s2.length(); memset(lcs,0,sizeof(lcs)); for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ if(s1[i-1]==s2[j-1]) lcs[i][j]=lcs[i-1][j-1]+1; else{ lcs[i][j]=max(lcs[i-1][j],lcs[i][j-1]); } } } return lcs [m]; } int main() { string s1; string s2; while(cin>>s1){ s2=s1; reverse(s2.begin(),s2.end()); if(s1.length()==1){ cout<<0<<endl; } else{ cout<<s1.length()-maxLcs(s1,s2)<<endl; } } return 0; } //abcda
相关文章推荐
- 腾讯 2017 暑假实习生编程题(一):给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢? 输出需要删除的字符个数。
- 可删除某些字符的最长回文字符串(2016腾讯在线笔试题)
- JAVA动态规划(三)--最长回文字符串(可删除中间字符)【腾讯2016实习生笔试题】
- 找工作知识储备(2)---数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串
- 数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串
- 409. Longest Palindrome (计算可由一个字符串中数字字符构成的最长回文数的长度)
- 给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢? 输出需要删除的字符个数。
- 腾讯2017暑期实习生编程题之构造回文
- 找工作知识储备---数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串
- 腾讯2017暑期实习生编程题-构造回文
- [编程题]删除字符串中出现次数最少的字符
- 插入最少的字符使字符串成为回文串 <最长公共子序列 + 回文>
- 动态规划问题--最长公共子序列(LCS)问题--删除一些字符使得剩下的是一个回文子串
- 最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串
- 给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?
- 字符串中的最长回文字符
- 数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串 (转)
- 2014百度校园招聘笔试——求一个字符串的最长回文子串
- 去掉若干个字符后的最长回文字符串
- 给定字符串,删除最少的字符,使剩下的字符串成为回文串