30:字符环
总时间限制:
1000ms
内存限制:
65536kB
描述
有两个由字符构成的环。请写一个程序,计算这两个字符环上最长连续公共字符串的长度。例如,字符串“ABCEFAGADEGKABUVKLM”的首尾连在一起,构成一个环;字符串“MADJKLUVKL”的首尾连在一起,构成一个另一个环;“UVKLMA”是这两个环的一个连续公共字符串。
输入
一行,包含两个字符串,分别对应一个字符环。这两个字符串之间用单个空格分开。字符串长度不超过255,且不包含空格等空白符。
输出
输出一个整数,表示这两个字符环上最长公共字符串的长度。
样例输入
ABCEFAGADEGKABUVKLM MADJKLUVKL
样例输出
6
看到这道题字符串首位相接,我第一个想到的就是把字符串 * 2,然后进行暴力遍历,但是只有6分。
ac
acac
acac
ac
对于上面的样例,实际结果应该是 2 ,但是我写出了4,因为当我短的字符串匹配长串时,把原串都 * 2,结果就出来了 4,那我们怎么避免这种情况呢?
解题思路
第一步,先把字符串成环,
第二步,进行匹配找到最大公共子序列
最大公共子序列的长度是不超过最短的那个字符串的。
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
int x, y, len, len1, len2, limit, ans=0;
string s1, s2;
cin >> s1 >> s2;
len1 = s1.size();
len2 = s2.size();
limit = min(len1, len2); //最短字符串的长度
s1 += s1; // 造环
s2 += s2; // 造环
for (int i=0; i<len1; i++){
for (int j=0; j<len2; j++){
len = 0;
x = i;
y = j;
while (s1[x++]==s2[y++] && len<limit) //不能超过段长
len++;
if (len > ans)
ans = len;
}
}
cout << ans << endl;
return 0;
}