NC21796. 最长公共包含串
描述
输入描述
输入四行,每行包含一个字符串,字符集为'a'-'z'
每个字符串长度在10以内
输出描述
输出一个整数
示例1
输入:
abc ab bc b
输出:
3
示例2
输入:
a bc def ghij
输出:
10
示例3
输入:
thereare arelots lotsof ofcases
输出:
19
C++(g++ 7.5.0) 解法, 执行用时: 3ms, 内存消耗: 504K, 提交时间: 2023-07-14 22:00:43
#include<iostream> #include<algorithm> using namespace std; string s[4]; string concat_strings(const string& str1, const string& str2) { for (int i = 0; i < (int)str1.length(); i++){ if (str1.substr(i)==str2.substr(0,(str1.length()-i))){ return str1.substr(0,i)+str2; } } return str1 + str2; } int main() { for (int i = 0; i < 4; i++) cin >> s[i]; int ans = 40,a[4] = { 0,1,2,3 }; do { auto res = s[a[0]]; for (int i = 1; i < 4; i++){ if (res.find(s[a[i]])!= std::string::npos){ continue; }else { res = concat_strings(res, s[a[i]]); } } ans = min((int)res.length(), ans); } while (next_permutation(a, a + 4)); cout << ans << endl; return 0; }
C++11(clang++ 3.9) 解法, 执行用时: 5ms, 内存消耗: 632K, 提交时间: 2019-08-28 11:09:12
#include<iostream> using namespace std; string a[10]; void judge(string&a,string b){ if(a.find(b)!=string::npos) return; for(int i=b.size()-1;i>=0;i--){ if(a.rfind(b.substr(0,i))!=string::npos&&a.rfind(b.substr(0,i))==a.size()-i){ a=a+b.substr(i,b.size()-i); break; } } } int main(){ for(int i=0;i<4;i++){ cin>>a[i]; } int ans=100; for(int i=0;i<4;i++){ for(int j=0;j<4;j++){ for(int k=0;k<4;k++){ for(int l=0;l<4;l++){ if(i==l||i==j||i==k||j==l||j==k||l==k) continue; string str=a[i]; judge(str,a[j]); judge(str,a[k]); judge(str,a[l]); ans=min(ans,(int)str.size()); } } } } cout<<ans<<endl; return 0; }