【问题标题】:Algorithm: Is it possible to form a valid string算法:是否可以形成一个有效的字符串
【发布时间】:2019-03-08 12:49:37
【问题描述】:

假设我们有 n 个三个字母的子字符串。可以通过连接这些 N 个子字符串来制作长度为 n+2 的字符串(其中重叠的字母只写一次)。因此该字符串必须具有 a1,a2,a3,a4... 的形式...

因此,仅允许在两个相邻位置重叠的两个子字符串链接: 'yxz' + 'xzw' = 'yxzw' ,但例如不允许使用 'yxz' + 'aby'。

示例 1:n = 3 个三个字母的子字符串是 'abc','cde','bcd' 输出:YES .因为 'abc' + 'bcd'+ 'cde' = 'abcde' 是 n+2 = 5 个字母的有效字符串。

示例 2:n = 3 个三个字母的子字符串是 'abc','bca','bcd' 输出:NO。因为不可能将它们全部连接起来。

我怎样才能找到一个有效的算法来解决这个问题?使用 O(n!) 尝试所有可能的组合花费的时间太长了

【问题讨论】:

  • 我认为你可以使用 2 张地图。 n 可以有多大?
  • @vivek_23 n的最大值约为10^4
  • 看起来您需要为此使用回溯。因为在发生冲突的情况下,我们无法保证哪一个会导致我们找到消耗所有子字符串的解决方案。另外,单个子串可以重复吗?
  • 为什么Example 2没有解决方案?我看到bca + abc => bcabc,来自一组 3 个字符串的 5 个字符。我们必须使用集合中的所有字符串吗?必须按顺序使用吗?
  • @Prune 我的印象是它们必须完全重叠在两个字符上(结束 + 开始)。因此,OP 的示例是 'yxz' + 'xzw' = 'yxzw'

标签: algorithm substring


【解决方案1】:

解决此类问题的一种流行方法是构建输入序列的重叠图,其顶点是您的三元组,其中两个三元组之间的弧a_i -> a_j 表示a_i 的最后两个字母是a_j 的前两个字母;然后在结果图中找到Hamiltonian path

天真的搜索当然不会胜过您提到的详尽搜索,但链接的 Wikipedia 文章提供了一些关于如何更有效地执行此操作的线索。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    • 2013-02-20
    相关资源
    最近更新 更多