最長共通部分列(dp、c ++)

トピック:

説明:2つの文字列AとBが与えられた場合、AとBの共通部分である文字列を見つけます(共通部分は不連続になる可能性があります)。

解決策:dp、2次元配列dp [i] [j]を開きます。これは、たとえば、a [1]からa [i]およびb [1]からb [j]の最長共通部分列を表します。 "story" bが "sbtar"の場合、dp [2] [3]は、stとsbtが比較され、最長がstであるため、2に等しいことを意味します。おそらく次のグラフです。ここに画像の説明を挿入します

次に、a [i] == b [j]、dp [i] [j] = dp [i-1] [j-1]の場合、現在の文字が等しくない場合は、2つの文字列をに追加する必要があるためです。現在の2文字の最長サブシーケンスは同じです。
したがって、a [i]!= b [j]、dp [i] [j] = max(dp [i-1] [j]、dp [i] [j-1])の場合、これは文字と等しいことを意味します文字列から1を引いたもの、またはb文字列から最後の文字の最長サブシーケンスの最大値を引いたもの(驚くべきことです)。

完全なコード:

#include<algorithm>
#include<iostream>
#include<string.h>
using namespace std;
char a[100];
char b[100];
int dp[101][101];


int main()
{
    
    
	cin >> a >> b;
	int la = strlen(a);
	int lb = strlen(b);
	memset(dp, 0, sizeof dp);		//初始化0,因为第0个元素没有最长子序列,而且dp[1][1]之类的也要用到
	for (int i = 1; i <= la; i++)
		for (int j = 1; j <= lb; j++)
		{
    
    
			if (a[i] == b[j]) dp[i][j] = dp[i - 1][j - 1] + 1;
			else dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
		}
	cout << dp[la][lb];		//遍历到dp[i][j]是最大值
	return 0;
}

あとがき:私は風邪が好きではなく、効率が非常に低いです

おすすめ

転載: blog.csdn.net/Kyrie_irving_kun/article/details/114993637