列表

详情


NC21574. 小乐乐匹配字符串

描述

小乐乐有字符串str1,str2。
小乐乐想要给他们找朋友。
小乐乐想知道在这两个字符串中最多能匹配出多长的相同子串(可非连续)。

输入描述

第一行输入字符串str1;

第二行输入字符串str2;

数据保证字符串长度小于1000,且非空,字符串仅由小写字母组成。

输出描述

输出最长相同子串的长度。

示例1

输入:

asd
ad

输出:

2

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 10ms, 内存消耗: 4296K, 提交时间: 2018-12-02 14:38:46

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int c[1010][1010];
int main()
{
	string a,b;
	cin>>a>>b;
	int la=a.length(),lb=b.length(),i,j;
	for( i=1;i<=la;i++)
	{
		for( j=1;j<=lb;j++)
		{
			if(a[i-1]==b[j-1])
			c[i][j]=c[i-1][j-1]+1;
			else
			c[i][j]=max(c[i-1][j],c[i][j-1]);
		}
	}
	cout<<c[la][lb]<<endl;
	return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 8ms, 内存消耗: 4300K, 提交时间: 2020-03-16 21:05:53

#include<iostream>
#include<string>
using namespace std;
int dp[1010][1010];
int main()
{
	string a,b;
	cin>>a>>b;
	int l1=a.length(),l2=b.length();
	for(int i=1;i<=l1;i++)
	for(int j=1;j<=l2;j++)
	if(a[i-1]==b[j-1])
	dp[i][j]=dp[i-1][j-1]+1;
	else
	dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
	cout<<dp[l1][l2]<<endl;
}

Python3(3.5.2) 解法, 执行用时: 1540ms, 内存消耗: 12056K, 提交时间: 2020-02-24 20:54:08

s1 = input()
s2 = input()
l1,l2 = len(s1),len(s2)
M = [[0]*(l2+1) for i in range(l1+1)]
for i in range(l1):
    for j in range(l2):
        a = 1 if s1[i]==s2[j] else 0
        M[i+1][j+1] = max([M[i][j]+a, M[i][j+1], M[i+1][j]])
print(M[l1][l2])

上一题