题解 | #查找两个字符串a,b中的最长公共子串#

查找两个字符串a,b中的最长公共子串

http://www.nowcoder.com/practice/181a1a71c7574266ad07f9739f791506

元素相等时:dp[i][j]=dp[i-1][j-1]+1
元素不相等时:dp[i][j]=0
遍历找dp最大值时要加一个条件:max在短串中的坐标最小
/*HJ65 查找两个字符串a,b中的最长公共子串*/
#include<iostream>
using namespace std;
int main()
{
    string a;
    string b;
    string shorty;
    string longy;
    int dp[350][350];
    cin>>a>>b;
    for(int i=0;i<=a.length();i++)
    {
        for(int j=0;j<=b.length();j++)
        {
            dp[i][0]=0;
            dp[0][j]=0;
        }
    }
    for(int i=1;i<=a.length();i++)
    {
        for(int j=1;j<=b.length();j++)
        {
            if(a[i-1]==b[j-1]) dp[i][j]=dp[i-1][j-1]+1;
            else dp[i][j]=0;
        }
    }
    int max=0,aa,bb;
    for(int i=0;i<=a.length();i++)
    {
        for(int j=0;j<=b.length();j++)
        {
        	if(a.length()<b.length())
        	{
        		if(dp[i][j]>max||dp[i][j]==max&&i<aa)
				{
					max=dp[i][j];
					aa=i;
					bb=j;
				}
			}
			else if(a.length()>=b.length())
			{
				if(dp[i][j]>max||dp[i][j]==max&&j<bb)
				{
					max=dp[i][j];
					aa=i;
					bb=j;
				}
			}        	
//           	cout<<dp[i][j]<<" ";
        }
//        cout<<endl;
    }
//    cout<<max<<" "<<s<<" "<<l<<endl;
    if(a.length()<b.length())
    cout<<a.substr(aa-max,max)<<endl;
    else if(a.length()>b.length())cout<<b.substr(bb-max,max)<<endl;
}


全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务