题意
给四个字符串,问能包括他们四个,并且长度最短的字符串的长度是多少。
思路
长度越短,说明上一个字符串末尾和当前字符串开头的相同越多。
考虑到数据非常小,我们可以枚举所有排列,然后逐个处理。
当前字符串有两种选择
- 它是之前字符串的子串,那么就可以直接跳过。
- 他能和之前字符串的末尾消去一部分。这时候通过截取子串来判断。
然后合并剩下的字符串,继续下一个。
最后取所有排列的最小值。
代码
class FourStrings {
public:
string s[4];
int ans = INF;
void solve() {
int sub = 0;
string str = s[0];
for (int i = 1; i < 4; i++) {
int len = min(SZ(s[i]), SZ(str));
if (str.find(s[i]) != string::npos) {
sub += SZ(s[i]);
continue;
}
while (len >= 0 && str.substr(SZ(str) - len).find(s[i].substr(0, len)) == string::npos) --len;
str += s[i].substr(len);
}
ans = min(ans, SZ(str));
}
int shortestLength(string a, string b, string c, string d) {
s[0] = a, s[1] = b, s[2] = c, s[3] = d;
sort(s, s + 4);
do {
solve();
} while (next_permutation(s, s + 4));
return ans;
}
};