Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2962 Accepted Submission(s): 977
Problem Description
最后的挑战终于到了!
站在yifenfei和MM面前的只剩下邪恶的大魔王lemon一人了!战胜他,yifenfei就能顺利救出MM。
Yifenfei和魔王lemon的挑战很简单:由lemon给出三个字符串,然后要yifenfei说出第一串的某个子串,要求该子串长度最小,并且同时包含第2个串和第3个串。
特别地,如果有多个这样的子串,则请输出字母序最小的一个。
Input
输入数据首先是一个整数C,表示测试数据有C组;
接着是C组数据,每组包含三行字符串,第一个字符串长度大于1小于100
后面两个串的长度大于1且小于10
Output
请对应每组输入数据输出满足条件的最短子串;
如果没有,请输出 No
Sample Input
2
abcd
ab
bc
abc
ab
bd
Sample Output
abc
No
Author
yifenfei
Source
ACM程序设计期末考试081230
问题链接:HDU2572 终曲
问题简述:(略)
问题分析:一般而言,有关字符串匹配的问题会使用像KMP那样的算法来解决。然而,C++的字符串类中的方法(函数)应该会使用像KMP那样的算法,所以直接使用字符串类中的方法(函数)可以解决绝大部分问题。
程序说明:使用了若干字符串类的方法(函数)来解决字符串匹配问题。看代码,不解释。
参考链接:(略)
题记:经典的字符串匹配解法。
AC的C++语言程序如下:
/* HDU2572 终曲 */
#include <bits/stdc++.h>
using namespace std;
int main()
{
int t;
string s1, s2, s3;
cin >> t;
while(t--) {
cin >> s1 >> s2 >> s3;
int p2 = s1.find(s2);
int p3 = s1.find(s3);
if(p2 == (int)string::npos || p3 == (int)string::npos)
cout << "No" << endl;
else if(s2.find(s3) != string::npos)
cout << s2 << endl;
else if(s3.find(s2) != string::npos)
cout << s3 << endl;
else {
string ans(s1);
// 算出子串最短长度
int minlen = min(s2.length(), s3.length());
// 枚举长度和起点
int len = s1.size();
for(int i = minlen; i <= len; i++) {
for(int j = 0; j <= len - i; j++) {
string t = s1.substr(j, i);
if(t.find(s2) != string::npos && t.find(s3) != string::npos) {
if(t.size() < ans.size() || (t.size() == ans.size() && t < ans))
ans = t;
}
}
if(ans != s1) break; // 某长度找到解就不必找更长的解
}
cout << ans << endl;
}
}
return 0;
}