本题的关键是将两个长条的嵌合想象成动态的过程:两长条嵌合只有两种情况,长条s向左移动嵌入长条t或者长条t向左移动嵌入长条s。
题目链接:UVa 1588
AC代码:
#include <iostream>
#include <string>
using namespace std;
int min(int a, int b) {
if (a > b)
return b;
else
return a;
}
int max(int a, int b) {
if (a > b)
return a;
else
return b;
}
int main() {
string s, t;
bool flag; //用于标记是否嵌合成功
int i, j;
while (cin >> s >> t) {
int len1 = s.length(), len2 = t.length();
for (i = 0; i < len1; i++) {
flag = 1;
for (j = 0; j < len2 && i + j < len1; j++) {
if (s[i + j] == t[j] && t[j] == '2') {
flag = 0;
break;
}
}
if ((j == len2 || i + j == len1) && flag) //当s或者t全部匹配完毕,并且嵌合成功时,跳出循环
break;
}
int x = max(len1, i + len2); //为什么取最大值想一下就明白了
for (i = 0; i < len2; i++) {
flag = 1;
for (j = 0; j < len1 && i + j < len2; j++) {
if (t[i + j] == s[j] && s[j] == '2') {
flag = 0;
break;
}
}
if ((j == len1 || i + j == len2) && flag)
break;
}
int y = max(len2, i + len1);
cout << min(x, y) << endl; //输出成功嵌合所需的最小长度
}
return 0;
}