python - 分区中唯一子字符串的最大数量

标签 python string algorithm

我修改了标题,以便更容易理解。

这是问题的详细版本:

我们有一个字符串s并希望将其拆分为子字符串。每个子字符串彼此不同。我们可以从一次剪切中获得的唯一子字符串的最大数量是多少。换句话说,连接形成 s 的唯一子字符串的最大数量是多少? 。

以下是一些示例:

Example 1
s = 'aababaa'
output = 4
Explain: we can split `s` into aa|b|aba|a or aab|a|b|aa, 
         and 4 is the max number of substrings we can get from one split.

Example 2
s = 'aba'
output = 2
Explain: a|ba

Example 3
s = 'aaaaaaa'
output = 3
Explain: a|aa|aaaa

注意:s仅包含小写字符。我不知道多久s因此无法猜测最佳时间复杂度。 :(

这是一个NP难题吗?如果没有,如何有效解决?

我从一位 friend 那里听到这个问题,但无法回答。我正在尝试使用 Trie + 贪婪来解决这个问题。对于第一个示例,该方法失败。

这是我想出的 Trie 解决方案:

def triesolution(s):
    trie = {}
    p = trie
    output = 0
    for char in s:
        if char not in p:
            output += 1
            p[char] = {}
            p = trie
        else:
            p = p[char]
    return output

对于示例 1,上面的代码将返回 3,因为它试图拆分 s进入a|ab|abaa .

补充:感谢大家的想法,看起来这个问题非常接近NP问题。现在我正在尝试从这个方向去思考。假设我们有一个函数 Guess(n) 。该函数将返回True如果我们能找到n来自一次分割的唯一子字符串或 False否则。这里的一个观察结果是,如果 Guess(n) == True ,然后Guess(i) == True对于所有人i <= n 。因为我们可以将两个相邻的子串合并在一起。这种观察可以得出二元解决方案。然而,它仍然需要我们可以计算 Guess功能非常有效。遗憾的是,我仍然找不到计算 Guess(n) 的多项式方法。 .

最佳答案

这被称为碰撞感知字符串分区问题,并且在 Anne Condon、Ján Maňuch 和 Chris Thachuk 的论文 - 复杂性中通过从 3-SAT 的简化证明是 NP 完全问题碰撞感知字符串划分问题及其与基因合成寡核苷酸设计的关系(国际计算和组合学 session ,265-275,2008)。

关于python - 分区中唯一子字符串的最大数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58740839/

相关文章:

python - 通过删除表情符号来清理字符串

python - Keras:嵌入句子数组作为输入

java - 如何创建一个相对路径来附加到在JAVA中不使用java.nio.file的URL?

python 2.7 : remove a key from a dictionary by part of key

Javascript/node.js 可以存储任意二进制数据并非常快速地追加的对象

android - 如何制作组合随机数矩阵

algorithm - 最大化可调度作业数量的网络流方法

java - 如何在 Java 中展平字典数组?

python - 如何将矢量 reshape 为 TensorFlow 的过滤器?

Python如何将子进程定向到输出文件