打印最长公共子序列
Problem statement:
问题陈述:
Given two strings, you have to find and print the longest common subsequence between them.
给定两个字符串,您必须找到并打印它们之间最长的公共子序列。
Input:
T Test case
T no of input string will be given to you.
E.g.
3
abcd abxy
sghk rfgh
svd vjhfd
Constrain
1≤ length (string1) ≤100
1≤ length (string2) ≤100
Output:
Print the length of the longest common subsequence formed from these two strings.
Example
例
T=3
Input:
abcd abxy
Output:
2 (xy)
Input:
sghk rfgh
Output:
2 (gh)
Input:
svd vjhfd
Output:
2 (vd)
Explanation with example:
举例说明:
Let there are two strings str1 and str2.
假设有两个字符串str1和str2 。
str1 = "abcd"
str2 = "abxy"
Using a dynamic programming algorithm to find the longest common subsequence between two given string is very efficient and fast as compared to the recursion approach.
与递归方法相比,使用动态编程算法查找两个给定字符串之间最长的公共子序列非常有效且快速。
Let f(a,b) = count the number of common subsequence from the two string starting from 0 to position a and starting from 0 to position b.
令f(a,b) =计算从0开始到位置a以及从0开始到位置b的两个字符串的公共子序列数。
Considering the two facts:
考虑到两个事实:
If the character of string1 at index a and character of string1 at index b are the same then we have to count how many characters are the same between the two strings before these indexes? Therefore,
如果索引a的字符串 1的字符和索引b的字符串 1的字符相同,那么我们必须计算在这些索引之前两个字符串之间有多少个相同的字符? 因此,
f(a,b)=f(a-1,b-1)+1
If the character of string1 at index a and character of string1 at index b are not same then we have to calculate the maximum common character count between (0 to a-1 of string1 and 0 to b of string2) and (0 to a of string1 and 0 to b-1 of string2).
如果字符串 2中的索引和字符串1的字符索引b中的符不相同,则我们来计算之间的最大公共字符计数(0到字符串1的A-1和0至b 字符串2)和(0至a的string1和0到string2的 b-1 )。
f(a,b) = max(f(a-1,b),f(a,b-1))
For the two strings:
对于两个字符串:
str1 = "abcd"
str2 = "abxy"
![Printing Longest Common Subsequence](https://i-blog.csdnimg.cn/blog_migrate/e503dd0abe054257b310d51e151ef066.png)
C++ Implementation:
C ++实现:
#include <bits/stdc++.h>
using namespace std;
int count(string str1, string str2)
{
int len1 = str1.length();
int len2 = str2.length();
int arr[len1 + 1][len2 + 1];
memset(arr, 0, sizeof(arr));
for (int i = 1; i <= len1; i++) {
for (int j = 1; j <= len2; j++) {
if (str1[i - 1] == str2[j - 1]) {
arr[i][j] = arr[i - 1][j - 1] + 1;
}
else {
arr[i][j] = max(arr[i - 1][j], arr[i][j - 1]);
}
}
}
return (arr[len1][len2]);
}
int main()
{
int t;
cout << "Test Case: ";
cin >> t;
while (t--) {
string str1, str2;
cout << "Enter the two strings: ";
cin >> str1 >> str2;
cout << "length of the Shorest SubString: " << count(str1, str2) << endl;
}
return 0;
}
Output
输出量
Test Case: 3
Enter the two strings: abcd abxy
length of the Shorest SubString: 2
Enter the two strings: sghk rfgh
length of the Shorest SubString: 2
Enter the two strings: svd svjhfd
length of the Shorest SubString: 3
翻译自: https://www.includehelp.com/icp/printing-longest-common-subsequence.aspx
打印最长公共子序列