用 Python 编写程序,查找字符串及其子字符串的总相似度
pythonserver side programmingprogramming更新于 2025/12/13 2:20:17
假设我们有一个字符串 s。我们必须找到字符串 s 与其每个后缀的相似度之和。这里两个字符串之间的相似度是两个字符串最长的公共前缀的长度。
因此,如果输入为 s = "pqpqpp",则输出将为 11,因为字符串的后缀为 "pqpqpp"、"qpqpp"、"pqpp"、"qpp"、"pp" 和 "p"。这些子字符串与字符串 "pqpqpp" 的相似度分别为 6、0、3、0、1 和 1。因此总和为 6 + 0 + 3 + 0 + 1 + 1 = 11。
为了解决这个问题,我们将遵循以下步骤 −
- 长度 := s 的大小
- 总计 := 长度
- z := 最初包含 0 的列表
- l := 0, r := 0
- 对于范围从 1 到长度 - 1 的 k,执行
- 如果 k > r,则
- 匹配:= 0
- 索引 := k
- 当索引 < length,do
- 如果 s[index] 与 s[match] 相同,则
- match := match + 1
- index := index + 1
- 否则,
- 退出循环
- 如果 s[index] 与 s[match] 相同,则
- 在 z 末尾插入匹配项
- 如果匹配项 > 0,则
- total := total + match
- l := k
- r := index-1
- 否则,
- 如果 z[k-l] < (r-k)+1,则
- 将 z[k-l] 插入到 z 的末尾
- total := total + z[k-l]
- 否则,
- match := r-k
- index := r
- 当 index < length 时,执行
- 如果 s[index] 与 s[match] 相同,则
- match := match + 1
- index := index + 1
- 否则,
- come out from loop
- 如果 s[index] 与 s[match] 相同,则
- 在 z 末尾插入匹配项
- total := total + match
- l := k
- r := index-1
- 如果 z[k-l] < (r-k)+1,则
- 如果 k > r,则
- 返回 total
示例
让我们看看下面的实现以便更好地理解 −
def solve(s): length = len(s) total = length z = [0] l = 0 r = 0 for k in range(1,length): if k > r: match=0 index = k while index < length: if s[index] == s[match]: match +=1 index +=1 else: break z.append(match) if match > 0: total+=match l = k r = index-1 else: if z[k-l] < (r-k)+1: z.append(z[k-l]) total+=z[k-l] else: match = r-k index = r while index < length: if s[index] == s[match]: match +=1 index +=1 else: break z.append(match) total+=match l = k r = index-1 return total s = "pqpqpp" print(solve(s))
输入
"pqpqpp"
输出
11
相关文章
有用资源
python 参考教程 - 该教程包含有关 python 的更多信息:https://www.cainiaomax.com/python/

