给定一个字符串S
长度n
。选择一个整数K
和两个非空子序列 A
和B
长度K
使其满足以下条件:
-
A = B
即对于每个i
ith
A
中的角色与ith
相同B
中的角色。 - 让我们表示用于构造
A
的索引如a1,a2,a3,...,an
哪里ai belongs to S
和B
如b1,b2,b3,...,bn
哪里bi belongs to S
。如果我们表示A
中公共(public)索引的数量和B
通过M
然后M + 1 <= K
。
求 K
的最大值这样就可以找到子序列 A
和B
从而满足上述条件。
约束:
0 < N <= 10^5
我观察到的事情是:
K = 0
的值如果给定字符串中的字符数全部不同,即S = abcd
。-
K = length of S - 1
如果字符串中的所有字符都相同,即S = aaaa
。 M
的值不能等于K
因为那时M + 1 <= K
不会是真的,即你不能有子序列A
和B
满足A = B
和a1 = b1, a2 = b2, a3 = b3, ..., an = bn
.- 如果字符串
S
则K = (Total number of times a character is repeated in the string if the repeatation count > 1) - 1
是回文。即S = tenet
然后t
重复2
次,e
重复2
次,一个字符重复的总次数 =4
, K =4 - 1 = 3
.
我在设计解决上述问题的算法时遇到困难。
如果您需要更多说明,请在评论中告诉我。
最佳答案
(更新:参见O(n)
answer。)
我们可以修改经典longest common subsequence递归以获取额外参数。
我希望 JavaScript 代码(未内存)是不言自明的:
function f(s, i, j, haveUncommon){
if (i < 0 || j < 0)
return haveUncommon ? 0 : -Infinity
if (s[i] == s[j]){
if (haveUncommon){
return 1 + f(s, i-1, j-1, true)
} else if (i == j){
return Math.max(
1 + f(s, i-1, j-1, false),
f(s, i-1, j, false),
f(s, i, j-1, false)
)
} else {
return 1 + f(s, i-1, j-1, true)
}
}
return Math.max(
f(s, i-1, j, haveUncommon),
f(s, i, j-1, haveUncommon)
)
}
var s = "aabcde"
console.log(f(s, s.length-1, s.length-1, false))
关于string - 求 K 的最大值,使得子序列 A 和 B 存在且满足上述条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59305732/