string - 求 K 的最大值,使得子序列 A 和 B 存在且满足上述条件

标签 string algorithm data-structures dynamic-programming

给定一个字符串S长度n 。选择一个整数K和两个非空子序列 AB长度K使其满足以下条件:

  1. A = B即对于每个 i ith A 中的角色与 ith 相同B 中的角色。
  2. 让我们表示用于构造 A 的索引如a1,a2,a3,...,an哪里ai belongs to SBb1,b2,b3,...,bn哪里bi belongs to S 。如果我们表示 A 中公共(public)索引的数量和B通过M然后M + 1 <= K

K 的最大值这样就可以找到子序列 AB从而满足上述条件。

约束:
0 < N <= 10^5

我观察到的事情是:

  • K = 0 的值如果给定字符串中的字符数全部不同,即 S = abcd
  • K = length of S - 1如果字符串中的所有字符都相同,即 S = aaaa
  • M 的值不能等于K因为那时M + 1 <= K不会是真的,即你不能有子序列 AB满足A = Ba1 = b1, a2 = b2, a3 = b3, ..., an = bn .
  • 如果字符串 SK = (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/

相关文章:

string - 为什么在使用 Vec::contains 时 &str 不强制转换为 &String?

javascript - 从一个 javascript 源创建多个函数作为字符串

c - 最优二叉树搜索

PHP 一次从字符串中删除多个内容

algorithm - 以下程序的运行时间是多少?

c++ - 从两个单链表中找到相同的节点。不能用hash,不能是O(n^2)复杂度

algorithm - 是否有一种数据结构用于存储自然数的 2D 点,允许检查 O(1) 中是否存在?

c - Segmentation Failure 错误 - 使用链表实现堆栈

c# - 如何逻辑排序字符串

c# - 字符串实际上是一个字符数组还是只有一个索引器?