最大公共子序列(删除字符使得剩下的是回文串)
2016-10-10 22:48
260 查看
给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?
输出需要删除的字符个数。
思路:采用常规方法复杂度太大,应该采用动态规划的思想。求原字符串和其反串的最大公共子序列(不是子串,因为可以不连续)的长度(使用动态规划),然后用原字符串的长度减去这个最大公共子串的长度就得到了最小删除的字符个数。
状态:当str1的下标为m,str2的下标是n的时候(不考虑后面的),此时的最长子序列长度L。
转移方程:1,如果str1(m)==str2(n),那么L(m,n)=L(m-1,n-1)+1。2,如果str1(m)!=str2(n),那么L(m,n)=max(L(m-1,n),L(m,n-1))
假如m和n相等,那么这个时候最大子序列无疑是前一个L(m-1,n-1)加上1,因为这两个字符串这个地方的字符都可以加入到最长子序列里面去。如果不相等,那么要么舍弃新来的来自str1的那个字符m号,要么舍弃str2的n号字符(最长子序列每个位置上当然都是唯一确定的一个字符),舍弃之后,就从
L(m-1,n),L(m,n-1)当中挑一个更长的为当前状态的最长子序列。
输出需要删除的字符个数。
思路:采用常规方法复杂度太大,应该采用动态规划的思想。求原字符串和其反串的最大公共子序列(不是子串,因为可以不连续)的长度(使用动态规划),然后用原字符串的长度减去这个最大公共子串的长度就得到了最小删除的字符个数。
状态:当str1的下标为m,str2的下标是n的时候(不考虑后面的),此时的最长子序列长度L。
转移方程:1,如果str1(m)==str2(n),那么L(m,n)=L(m-1,n-1)+1。2,如果str1(m)!=str2(n),那么L(m,n)=max(L(m-1,n),L(m,n-1))
假如m和n相等,那么这个时候最大子序列无疑是前一个L(m-1,n-1)加上1,因为这两个字符串这个地方的字符都可以加入到最长子序列里面去。如果不相等,那么要么舍弃新来的来自str1的那个字符m号,要么舍弃str2的n号字符(最长子序列每个位置上当然都是唯一确定的一个字符),舍弃之后,就从
L(m-1,n),L(m,n-1)当中挑一个更长的为当前状态的最长子序列。
<pre name="code" class="cpp">#include <iostream> #include <algorithm> #include <string> using namespace std; int getLCS(string &s1) { string s2(s1); reverse(s2.begin(),s2.end()); const int len=s1.length(); int dp[1000][1000]={0}; for(int i=0;i<len;++i){ for(int j=0;j<len;++j){ if(s1[i]==s2[j]) dp[i+1][j+1]=dp[i][j]+1; else dp[i+1][j+1]=max(dp[i][j+1],dp[i+1][j]); } } return len-dp[len][len]; } int main() { string s; while(cin>>s) cout<<getLCS(s)<<endl; return 0; }
相关文章推荐
- 给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?
- 腾讯 2017 暑假实习生编程题(一):给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢? 输出需要删除的字符个数。
- 2016腾讯笔试题,删除字符串中的字符,使得剩下的字符串是回文串,如何删除使得回文串最长
- 给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢? 输出需要删除的字符个数。
- 给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢? 输出需要删除的字符个数。
- 给定一个字符串a,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长? 输出需要删除的字符个数。
- 2016腾讯笔试题,删除字符串中的字符,使得剩下的字符串是回文串,如何删除使得回文串最长
- 求两字符串最长公共子序列LCS的应用—删除字符串的字符剩下回文串
- 动态规划问题--最长公共子序列(LCS)问题--删除一些字符使得剩下的是一个回文子串
- 【动态规划】LCS算法:求两字符串最大公共子序列/删除字符使成为回文串
- (字符串的处理4.7.16)POJ 1159 Palindrome(让一个字符串变成回文串需要插入多少个字符...先逆序,在减去公共子序列的最大长度即可)
- python进阶编程_1_回文串及最大公共子序列
- 求两个字符序列的最大公共子序列
- (字符串的处理4.7.16)POJ 1159 Palindrome(让一个字符串变成回文串需要插入多少个字符...先逆序,在减去公共子序列的最大长度即可)
- ACM 回文串&最大公共子序列
- UVA - 10192 Vacation(dp+最大公共子序列)
- 最大公共子序列
- 最大公共子序列
- UVa 10635 Prince and Princess(最大公共子序列)
- (不连续)最大公共子序列POJ 1458Common Subsequence