求最大公共子序列的长度
2017-03-26 15:29
218 查看
求两个字符串的最大公共序列的长度,比较简单的思想就是利用动态规划的思想来实现。先直接贴代码:
在代码中,利用dp数组来记录当前的到当前字符的最大公共子串。
假如:我们给str1赋值为abcd,给str2赋值为adcb。
我们的思想是这样的,先算出字符串a与字符串str2的最大公共子序列,发现a和str2的最大公共子序列为1,于是在a的基础基础上,计算字符串ad与str2的最大公共子序列的长度。以此类推,求出字符串str1与str2的最长子序列。
具体的实现过程结合下图可以比较清晰的看出来:
当str1与str2中的字符相等时,就取上一个dp[i-1][j-1]+1作为当前的最大公共子串的长度,譬如途中的黄色标识的块。如果不想等,就去前面或者上面值的最大值最为当前元素的值。所以,我们可以知道,最后dp[len1][len2]一定是最大的,也是我们所要求的值。
程序运行的结果如图:
运用:
例如下面的题目:
给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?
输出需要删除的字符个数。
输入描述:
输入数据有多组,每组包含一个字符串s,且保证:1<=s.length<=1000.
输出描述:
对于每组数据,输出一个整数,代表最少需要删除的字符个数。
输入例子:
abcda
google
输出例子:
2
2
参考ac代码:
//求两个字符串的最大公共子序列 int getMaxLength(string str1,string str2){ int len1 = str1.length(); int len2 = str2.length(); int dp[101][101]; for(int i=0;i<len1;i++){ for(int j=0;j<len2;j++){ if(str1[i]==str2[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 dp[len1][len2]; }
在代码中,利用dp数组来记录当前的到当前字符的最大公共子串。
假如:我们给str1赋值为abcd,给str2赋值为adcb。
我们的思想是这样的,先算出字符串a与字符串str2的最大公共子序列,发现a和str2的最大公共子序列为1,于是在a的基础基础上,计算字符串ad与str2的最大公共子序列的长度。以此类推,求出字符串str1与str2的最长子序列。
具体的实现过程结合下图可以比较清晰的看出来:
当str1与str2中的字符相等时,就取上一个dp[i-1][j-1]+1作为当前的最大公共子串的长度,譬如途中的黄色标识的块。如果不想等,就去前面或者上面值的最大值最为当前元素的值。所以,我们可以知道,最后dp[len1][len2]一定是最大的,也是我们所要求的值。
程序运行的结果如图:
运用:
例如下面的题目:
给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?
输出需要删除的字符个数。
输入描述:
输入数据有多组,每组包含一个字符串s,且保证:1<=s.length<=1000.
输出描述:
对于每组数据,输出一个整数,代表最少需要删除的字符个数。
输入例子:
abcda
输出例子:
2
2
参考ac代码:
#include<iostream> using namespace std; //求出最大公共子序列的长度 int getMaxLength(string str){ int dp[1001][1001]={0}; string str2; int len = str.length(); for(int i=0;i<len;i++){ str2[i]= str[len-i-1]; } for(int j=0;j<len;j++){ for(int i=0;i<len;i++){ if(str[i]==str2[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 str1; while(cin>>str1){ cout<<getMaxLength(str1)<<endl; } }
相关文章推荐
- java 递归求求两个串的最大公共子序列的长度
- 蓝桥杯常用算法知识点:【递归】求两个串的最大公共子序列的长度
- 动态规划_最大公共子序列长度问题
- java动态规划 实现输出最大公共子序列的长度以及输出最大子字符串
- 动态规划---实现输出最大公共子序列的长度以及输出最大子字符串(java语言描述)
- 求两个字符串公共子序列的最大长度(参考阿里巴巴2015研发笔试)(简单)
- 2015年阿里在线笔试题:求两个字符串的最大公共子序列长度的C语言解法
- 求两个序列的最大公共子序列的长度(递归解法)
- (字符串的处理4.7.16)POJ 1159 Palindrome(让一个字符串变成回文串需要插入多少个字符...先逆序,在减去公共子序列的最大长度即可)
- 递归小程序_求两个串的最大公共子序列的长度
- (字符串的处理4.7.16)POJ 1159 Palindrome(让一个字符串变成回文串需要插入多少个字符...先逆序,在减去公共子序列的最大长度即可)
- 求所有最大公共子序列的算法实现
- 求长度为n的序列中最大的m个数
- 求所有最大公共子序列的算法实现(转)
- 最大子序列、最长公共子串、最长公共子序列
- LCS(最大公共序列) scala版本
- 数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串
- hdu3308--LCIS 最大连续递增序列长度
- 动态规划之最长公共子序列和最长公共字串,最大子序列和
- 最大连续子序列和,最大上升子序列和,最长上升子序列,最长公共子串,最长公共子序列,最长上升公共子序列