思路解析:
因为是要输出在较短字符串中公共字符串最长的字段,而且是最先出现的那个。
所以,我们可以采用暴力匹配的思想,但是有个技巧,就是从针对较短的那个字段而言,将它按照从长到短的顺序逐个分离出来。
比如字符串的长度为10,那么我们就按照长度分别为10、9、8…2、1的情况来暴力匹配。由于是从长到短来匹配,因此当第一次匹配成功,即是答案。
特殊的双层循环:
假设字符串长度为10的s[10];那么逐渐遍历的字段为:
s(0,9)//第一次匹配
s(0,8)、s(1,9)//第二次匹配
s(0,7)、s(1,8)、s(2,9)//第二次匹配
…
外循环中控制字段的长度;
内循环中控制字段的首字母;
#include<iostream>
#include<string>
using namespace std;
int main()
{
string a, b;
while (cin >> a >> b)
{
int len1 = a.length();
int len2 = b.length();
if (len1 >= len2)//判断两个字符串的长短,对短字符串进行处理
{
for (int i = len2; i >= 0; i--)//外循环,控制匹配字段的长度
{
int d = 0;
for (int j = 0; j <= len2 - i; j++)//内循环,控制字段的起始位置
{
string temp = b.substr(j, i);
if (a.find(temp)!=string::npos)
{
cout << temp << endl;
d = 1;//控制结束外循环
break;
}
}
if (d == 1) break;
}
}
if (len1 <= len2)//判断两个字符串的长短,对短字符串进行处理
{
for (int i = len1; i >= 0; i--)
{
int d = 0;
for (int j = 0; j <= len1 - i; j++)
{
string temp = a.substr(j, i);
if (b.find(temp) != string::npos)
{
cout << temp << endl;
d = 1;
break;
}
}
if (d == 1) break;
}
}
}
}