您的位置:首页 > 其它

最大公共字符串输出

2016-06-30 20:44 204 查看
一.华为OJ题目:

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

详细描述:

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

接口设计及说明:

/*****************************************************************************

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

Input Param : String stringA, 输入字符串A

String stringB, 输入字符串B

Output Param :

Return Value : 成功返回最大公共子串,失败返回null(如:数据错误)

*****************************************************************************/

public static StringiQueryMaxCommString(String stringA, String stringB)

{

/* 在这里实现功能,将结果填入输入数组中*/

return null;

}

二.详细解答过程:

1.首先,计算2个字符串的长度。定义整形变量 counts,pos_end;lengthA=strA.length()

2.然后,进入两层循环:

(1)第一层循环,用i作递增变量(0~lengthA),初始化posA,countsA;

(2)第二层循环,用j作递增变量(0~lengthB)

进入第二层循环,寻找B字符串中与str[posA]相等的字符,如果找到,那么posA++,countsA++,

接着在第二层循环内继续寻找查看字符串B中是否下一个字符仍然与A字符串中的对应字符相同,

如果又找到,那么继续让posA++,countsA++,如果中间突然出现一个不相等然后后面一个又相等了怎么办?会不会出现误差?

事实证明不会出现这种情况,原因是posA++的同时j也在递增,所以他们是对应相等的时候,才会进入相应的条件语句

并且posA++,countsA++

(3)第二层循环结束之后,i++,那么再重新寻找公共字符串,如果找到更大的字符串,那么countsA>counts条件语句将成立

于是进入条件语句,counts更新,posA的位置也更新。(因为posA位置递增了,所以处理之后要-1)

3.该步骤将最大公共字符子串从末尾添加进string类str内;

4.函数返回str;

代码:

//求最大公共字符串并输出

#include <iostream>
#include <string>
using namespace std;
static string iQueryMaxCommString(string&stringA, string stringB)
{
int cnts=0,pos_end,lenA,lenB;
lenA=stringA.size();
lenB=stringB.size();
for(int i=0;i<lenA;i++)
{
int posA=i;
int countA=0;
for(int j=0;j<lenB;j++)
{
if(stringA[posA]==stringB[j])
{
countA++;
++posA;
if(cnts<countA)
{
cnts=countA;
pos_end=posA-1;
}
}
}
}
string str;
int begin=pos_end-cnts+1;
for(int j=begin;j<=pos_end;j++)
{
str.push_back(stringA[j]);
}
return str;
}

intmain()
{
string str1,str2;
getline(cin,str1);
getline(cin,str2);
cout<<iQueryMaxCommString(str1,str2)<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: