【问题标题】:Given an array of Strings, return true if each string could be connected to other给定一个字符串数组,如果每个字符串都可以连接到其他字符串,则返回 true
【发布时间】:2013-07-17 17:13:32
【问题描述】:

给定一个字符串数组,当且仅当所有字符串都可以连接在一个链中时返回 true。

连通性的条件是,如果一个字符串的最后一个字符与第二个字符串的第一个字符匹配,则两个字符串可以连通

示例:String []arr ={"abc", "cde", "cad" , "def" , "eac"} 将返回 true,因为所有字符串都可以连接在一个链中。

"abc"->"cde"->"eac"->"cad"->"def"

另一个示例:String []arr ={"acb" , "cde", "def", "ead" } 返回 False,因为
"cde"->"ead"->"def" 是可能的链,但“acb”被省略了。

注意:不一定要从第一个字符串开始形成链,如果从第一个字符串开始可能会得不到链。如果您从任何其他字符串开始,您可以获得一个链。如果存在可能的链,那么您的解决方案应该返回 true。

在第二个示例中,如果假设第一个字符串是“fcb”,那么可能存在一个链,"cde"->"ead"->"def"->"fcb" 所以True

可能的解决方案(我在想什么):将每个字符串视为一个图形节点,如果满足条件,则连接节点。一旦完成,问题就变成了寻找,

if there exists a Hamiltonian Cycle in a graph,这是 NP-Complete 问题。

有人建议一些算法或任何其他解决方案吗?

【问题讨论】:

    标签: arrays string algorithm data-structures


    【解决方案1】:

    您不是在寻找哈密顿循环(即开始 = 开始),而是寻找哈密顿路径,这也是一个 NP 完全问题。但是,您的图表不是通用的,因为只有 26 个字母。如果你允许超过 26 个字母的符号,那么它实际上等同于哈密顿寻路。

    这是一个解决方案:你应该反过来思考:

    • 图的顶点是26个字母。
    • 对于每个以 x 开头并以 y 结尾的单词,字母 x 和 y 之间都有一条边

    因此,您得到的实际上是一个 multigraph,因为多个单词可以以相同的字母开头和结尾。那么你正在寻找的东西被称为欧拉路径:它是一条每条边都恰好经过一次的路径。寻找欧拉路径是一个多项式问题 (https://en.wikipedia.org/wiki/Eulerian_path)。这实际上可能是历史上第一个图问题。

    现在引用维基百科:

    有向图有欧拉轨迹当且仅当至多一个顶点有(出度)-(入度)= 1,至多一个顶点有(入度) − (out-degree) = 1,每个其他顶点的入度和出度都相等,并且其所有非零度的顶点都属于底层无向图的单个连通分量。

    与搜索哈密顿路径相比,这是确定是否存在路径的更好方法。

    【讨论】:

    • 我认为您对欧拉路径的评论没有帮助(略有不同的问题),或者提供了任何额外的见解,很好地呼吁路径与循环的事情,尽管 +1。
    • 要么我不明白这个问题,要么它给出了一个完全正确的答案。你能解释一下为什么这些问题不同吗?
    • Hamiltonian 算法有据可查,如果您只需要“真/假”且没有实际路径,则可以查看一组简明的图表属性。
    • @ChrisCM。我不同意已经选择了正确的那个。找到哈密顿路径是一个难题(NP),而找到欧拉路径是一个非常容易的问题(P)。我指出,OP 问题既可以编码为哈密顿路径问题,也可以编码为欧拉路径问题。如果要解决,最好将其编码为更简单的问题。
    • 是的,我们只需要验证路径是否存在。我们不需要这里的实际路径。
    【解决方案2】:

    在这里回答了类似的问题:Detecting when matrix multiplication is possible

    您可以将其解决为比哈密顿路径简单得多的欧拉路径问题。

    不要让每个字符串成为图中的节点,而是让每个字母成为图中的节点。如果字符串从第一个字母开始并以另一个字母结束,则在两个字母之间添加有向边。现在,在此图中找到一条欧拉路径将为您提供所需的解决方案。

    【讨论】:

      【解决方案3】:

      假设您有一个大小为 26 的字母表。

      让我们把你的单词想象成一个有向图,有 26 个顶点对应所有字母 {a, b, ..., z}。

      对于您拥有的每个单词,在图表中添加一条有向边 - 从单词的开头字母到结尾的字母。

      然后你正在寻找这张图的欧拉路径 - 访问每条边的路径(通过你的每一个词)恰好一次。

      有一个著名的定理:

      n 个顶点上的有向图 G 有一个欧拉路径 iff。至少 n-1 个顶点的入度等于出度。

      此外,还有一些算法可以在多项式时间内构建这样的游览,例如 Fleury 算法。

      【讨论】:

        猜你喜欢
        • 2015-05-13
        • 1970-01-01
        • 1970-01-01
        • 2020-05-11
        • 2012-01-22
        • 1970-01-01
        • 2013-04-18
        • 2011-04-21
        • 2016-02-28
        相关资源
        最近更新 更多