最大公共子序列(删除字符使得剩下的是回文串)
来源:互联网 发布:中国酒类行业产量数据 编辑:程序博客网 时间:2024/06/11 14:46
给定一个字符串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)当中挑一个更长的为当前状态的最长子序列。
<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;}
0 0
- 最大公共子序列(删除字符使得剩下的是回文串)
- 动态规划问题--最长公共子序列(LCS)问题--删除一些字符使得剩下的是一个回文子串
- 求两字符串最长公共子序列LCS的应用—删除字符串的字符剩下回文串
- 给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?
- 2016腾讯笔试题,删除字符串中的字符,使得剩下的字符串是回文串,如何删除使得回文串最长
- 2016腾讯笔试题,删除字符串中的字符,使得剩下的字符串是回文串,如何删除使得回文串最长
- 腾讯 2017 暑假实习生编程题(一):给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢? 输出需要删除的字符个数。
- 给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢? 输出需要删除的字符个数。
- 给定一个字符串a,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长? 输出需要删除的字符个数。
- 【动态规划】LCS算法:求两字符串最大公共子序列/删除字符使成为回文串
- 构造回文(删除字符使得回文子串最长)
- 通过最长公共子串求得使得一个串变为回文串的最少添加字符
- 最大公共子序列,最大公共子串,最大回文子串
- 2017百度校园招聘编程题 删除字符构造最长回文字符串(求最长公共子序列的变种)
- 插入最少的字符使字符串成为回文串 <最长公共子序列 + 回文>
- 最大公共子序列-构造回文
- 求两个字符序列的最大公共子序列
- 最长回文子串、回文子序列、公共子序列
- CSDN博客插入图片方法
- Android中activity之间传递数据的几种实现方法
- ACdream-1726-A Math game(dfs+二分)
- Codeforces 691F. Couple Cover (暴力)
- Linux内核数据结构(2.6.32.27)链表
- 最大公共子序列(删除字符使得剩下的是回文串)
- (转载)django工作原理简介
- An easy problem
- 【Dongle】【数据结构】Linklist L、Linklist *L、Node *p 和Node p
- 88. Merge Sorted Array
- 使用 Aircrack-ng 破解 WEP 和 WPA/WPA2 加密的 Wi-Fi 密码。
- 求Sn=a+aa+aaa+aaaa+aaaaa的前5项之和,其中a是一个数字
- String对象的常用方法
- 笔试笔记————判断单向链表是否存在循环