LC2800. 包含三个字符串的最短字符串
给你三个字符串 a
,b
和 c
, 你的任务是找到长度 最短 的字符串,且这三个字符串都是它的 子字符串 。
如果有多个这样的字符串,请你返回 字典序最小 的一个。
请你返回满足题目要求的字符串。
注意:
- 两个长度相同的字符串
a
和b
,如果在第一个不相同的字符处,a
的字母在字母表中比b
的字母 靠前 ,那么字符串a
比字符串b
字典序小 。 - 子字符串 是一个字符串中一段连续的字符序列。
示例 1:
输入:a
= "abc",b
= "", c
= "aaa" 输出:"aaa" 解释:字符串 "aaa " 包含所有三个字符串:a = ans[2...4] ,b = ans[3..5] ,c = ans[0..2] 。结果字符串的长度至少为 6 ,且"aaa " 是字典序最小的一个。
示例 2:
输入:a
= "ab",b
= "ba",c
= "aba" 输出:"aba" 解释:字符串 "aba" 包含所有三个字符串:a = ans[0..1] ,b = ans[1..2] ,c = ans[0..2] 。由于 c 的长度为 3 ,结果字符串的长度至少为 3 。"aba" 是字典序最小的一个。
提示:
1 <= a.length, b.length, c.length <= 100
a
,b
,c
只包含小写英文字母。
思路分析
时间复杂度 O(
AC代码暴力枚举
通过
代码缺点:
1、用
2、1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34class Solution:
def minimumString(self, a: str, b: str, c: str) -> str:
def find(a:str,b:str):
x = min(len(a),len(b))
for i in range(x,-1,-1):
if a[-i:] == b[:i]:
return i
return 0
def dfs(x,deep):
if deep == 2:
ans.append((len(x),x))
for i in range(len(s)):
if not visited[i]:
visited[i] = True
if s[i] in x:
dfs(x,deep+1)
else:
t = find(x,s[i])
tt = find(s[i],x)
dfs(x + s[i][t:],deep+1)
dfs(s[i] + x[tt:],deep+1)
visited[i] = False
s = [a,b,c]
res = ''
visited = [False,False,False]
ans = []
for i,x in enumerate(s):
visited[i] = True
dfs(x,0)
visited[i] = False
ans.sort(key = lambda x:(x[0],x[1]))
return ans[0][1]
优化暴力
1 | class Solution: |
雪景式
暴力
1 | class Solution: |
精简
1 | class Solution: |
灵神
1 | class Solution: |