一.华为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;
}