列表

详情


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;
}

上一题