您的位置:首页 > 其它

华为OJ(查找两个字符串a,b中的最长公共子串)

2015-08-21 16:41 603 查看
描述
查找两个字符串a,b中的最长公共子串。

详细描述:查找两个字符串a,b中的最长公共子串。
接口设计及说明: /*****************************************************************************
Description   : 查找两个字符串a,b中的最长公共子串
Input Param   : String stringA, 输入字符串A
String stringB, 输入字符串B
Output Param  :
Return Value  : 成功返回最大公共子串,失败返回null(如:数据错误)
*****************************************************************************/
public static String iQueryMaxCommString(String stringA, String stringB)
{
/* 在这里实现功能,将结果填入输入数组中*/
return null;
}

知识点字符串
运行时间限制10M
内存限制128
输入输入两个字符串

输出返回重复出现的字符

样例输入abcdefghijklmnop abcsafjklmnopqrstuvw
样例输出jklmnop
最大公共子串问题,动态规划解决,这个问题和之前合唱队还有哪道题来着很像。
#include<iostream>
#include<string>
using namespace std;
int get_lcstring(string,string);
int main(void)
{
string s1,s2;
cin>>s1>>s2;
get_lcstring(s1,s2);
//system("pause");
return 0;
}
int get_lcstring(string s1,string s2)
{
int len1=s1.size();
int len2=s2.size();
int len=max(len1,len2);
int maxlen=0,index;
int **cnt=new int*[len1+1];
for(int i=0;i<=len1;i++)
cnt[i]=new int[len2+1];
for(int i=0;i<=len1;i++)
for(int j=0;j<=len2;j++)
cnt[i][j]=0;
for(int i=1;i<=len1;i++)
for(int j=1;j<=len2;j++)
if(s1[i-1]==s2[j-1]&&cnt[i][j]<cnt[i-1][j-1]+1)
{
cnt[i][j]=cnt[i-1][j-1]+1;
if(cnt[i][j]>maxlen)
{
maxlen=cnt[i][j];
index=i-1;
}
}
for(int i=0;i<=len1;i++)
delete [] cnt[i];
delete [] cnt;
for(int i=maxlen-1;i>=0;i--)
cout<<s1[index-i];
return maxlen;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: