我修改了标题,以使其更易于理解。
这是问题的详细版本:
我们有一个字符串s
,想要将其拆分为子字符串。每个子字符串彼此不同。一次切割最多可以拥有的唯一子字符串的数量是多少。换句话说,串联形成form的唯一子字符串的最大数量是多少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难题吗?如果没有,如何有效解决?
我从我的一个朋友那里听到了这个问题,无法解决。我正在尝试使用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,上面的代码将尝试拆分s
为,因此返回3 a|ab|abaa
。
补充:由于大家的想法,看来这个问题非常接近NP问题。现在,我正在尝试从这个方向进行思考。假设我们有一个函数Guess(n)
。True
如果我们可以n
从一个拆分中找到唯一的子字符串,则此函数将返回False
。这里的一个观察是,如果Guess(n) == True
,那么Guess(i) == True
就全部i <= n
。因为我们可以将两个相邻的子字符串合并在一起。这种观察可能导致二元解。但是,仍然需要我们能够Guess
非常有效地计算函数。可悲的是,我仍然找不到一种多项式计算方法Guess(n)
。
a
或b
?
aab|a|b|aa
仍然是4