华为机试HJ65:查找两个字符串a,b中的最长公共子串
Posted 翟天保Steven
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了华为机试HJ65:查找两个字符串a,b中的最长公共子串相关的知识,希望对你有一定的参考价值。
作者:Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处
题目描述:
查找两个字符串a,b中的最长公共子串。若有多个,输出在较短串中最先出现的那个。
注:子串的定义:将一个字符串删去前缀和后缀(也可以不删)形成的字符串。请和“子序列”的概念分开!
本题含有多组输入数据!
输入描述:
输入两个字符串
输出描述:
返回重复出现的字符
示例:
输入:
abcdefghijklmnop abcsafjklmnopqrstuvw
输出:
jklmnop
解题思路:
本题是字符串操作题。输入两个字符串,先判断长短;再从短串开始,先分析短串是否在长串中,若有,则返回;若无,则短串长度-1,即分析短串的两个子串是否在,同理直到找到某个子串符合要求,该子串肯定是符合要求的子串中最长的且最先出现;最后如果两个字符串连字母都没有交集,则返回空串。
测试代码:
#include <iostream>
#include <string>
using namespace std;
string getresult(string s1,string s2)
{
int lsize=s1.size();
int ssize=s2.size();
string result;
for(int i=ssize;i>=1;--i)
{
for(int j=0;j<(ssize-i+1);++j)
{
string temp=s2.substr(j,i);
int id=s1.find(temp);
if(id!=string::npos)
{
return temp;
}
}
}
return "";
}
int main()
{
string s1,s2;
while(cin>>s1>>s2)
{
string Long,Short;
if(s1.size()>s2.size())
{
Long=s1;
Short=s2;
}
else{
Long=s2;
Short=s1;
}
cout<<getresult(Long,Short)<<endl;
}
return 0;
}
以上是关于华为机试HJ65:查找两个字符串a,b中的最长公共子串的主要内容,如果未能解决你的问题,请参考以下文章
[LCS] nwHJ65 查找两个字符串a,b中的最长公共子串(LCS+KMP+substr暴力)