python-3.x - 如何从两个字符串中生成最短的字符串
问题描述
我想编写一个函数来从两个字符串 A、B 中返回最短的字符串 C,并确保字符串 A、B 是 C 的子字符串。但关键是 A 的长度不必比 B 长,例如:
A: 'abcd', B: 'cde' = > C: 'abcde' # c,d 重复
A: 'abcd', B: 'ecd' = > C: 'abcdecd' #没有字符重复所以C是A + B
A: 'abc', B: 'cdeab' = > C: 'cdeabc'
A: 'bce', B: 'eabc' = > C: 'eabce' #eabcd的长度是5,bceabc的长度是6
A: '', B: 'abc' = > C: 'abc'
A: 'abc', B: '' = > C: 'abc'
我有以下功能,但似乎不正确
def checksubstring(A, B):
if not A or not B: return A if not B else B
index, string = 0, ''
for i, c in enumerate(A):
index = index + 1 if c == B[index] else 0
string += c
return string + B[index:]
解决方案
您可以从最后备份寻找匹配项,例如:
代码:
def shortest_substring(a, b):
def checksubstring(a, b):
if not a or not b:
return b or a
for i in range(1, len(b)):
if a[len(a) - i:] == b[:i]:
return a + b[i:]
return a + b
x = checksubstring(a, b)
y = checksubstring(b, a)
return x if len(x) <= len(y) else y
测试代码:
results = [
{'A': 'abcd', 'B': 'cde', 'C': 'abcde'},
{'A': 'abcd', 'B': 'ecd', 'C': 'abcdecd'},
{'A': 'abc', 'B': 'cdeab', 'C': 'cdeabc'},
{'A': 'bce', 'B': 'eabc', 'C': 'eabce'},
{'A': '', 'B': 'abc', 'C': 'abc'},
{'A': 'abc', 'B': '', 'C': 'abc'},
]
for result in results:
assert result['C'] == shortest_substring(result['A'], result['B'])
推荐阅读
- async-await - 我在第 10 行收到了一个断言错误,即“预期未定义等于 '2 sec'”......为什么会这样?
- ios - 从随机字典键值创建数组
- javascript - Json / Discord.js:将基于输入的内容添加到 json 文件
- c# - NuGet 包 Microsoft.Toolkit.Uwp.Notifications 版本 7.0.2 无法识别 UWP TileContent
- mysql - mysql数据库表的foregin键中的自动inrement不起作用
- python - 检查是否在组中第一次看到列的值
- ios - React-native-agora 音频仅在后台模式下无法在前台模式下工作(iOS)
- c++ - 使用声明从可变参数模板 arg 给出的所有基类继承构造函数
- reactjs - 反应 | 由 props 更改更新的输入字段
- c# - 调用 cmd 行以获取 Windows 窗体的字符串值