Algorithm 算法:是否可以形成有效字符串

Algorithm 算法:是否可以形成有效字符串,algorithm,substring,Algorithm,Substring,假设我们有n个三个字母的子字符串。通过将这些n个子字符串连接起来(重叠的字母只写一次),可以从这些n个子字符串中生成一个长度为n+2的字符串。其中该字符串的形式必须为a1、a2、a3、a4 因此,只有在两个相邻位置重叠时才允许链接两个子字符串:“yxz”+“xzw”=“yxzw”,但例如,不允许“yxz”+“aby” 示例1:n=3三个字母的子字符串是'abc'、'cde'、'bcd'输出:是 . 因为'abc'+'bcd'+'cde'='abcde'是一个有效字符串,包含n+2=5个字母 示例

假设我们有n个三个字母的子字符串。通过将这些n个子字符串连接起来(重叠的字母只写一次),可以从这些n个子字符串中生成一个长度为n+2的字符串。其中该字符串的形式必须为a1、a2、a3、a4

因此,只有在两个相邻位置重叠时才允许链接两个子字符串:“yxz”+“xzw”=“yxzw”,但例如,不允许“yxz”+“aby”

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

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


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

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


一个天真的搜索当然不会比你提到的穷尽搜索更好,但是维基百科的链接文章提供了一些如何更有效地进行搜索的线索。

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