给定一个字符串数组,如果每个字符串都可以连接到其他字符串,则返回true

时间:2013-07-17 17:13:33

标签: arrays string algorithm data-structures

您将获得一个字符串数组,当且仅当所有字符串都可以在一个链中连接时才返回true。

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

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

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

另一个例子:String []arr ={"acb" , "cde", "def", "ead" }返回错误因为
"cde"->"ead"->"def"是可能的链,但“acb”被遗漏了。

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

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

可能的解决方案(我在想什么):将每个字符串视为图节点,并在条件满足时连接节点。一旦完成,问题就会减少到找到,

if there exists a Hamiltonian Cycle in a graph,这是NP完全问题。

有人建议使用某种算法或任何其他解决方案吗?

3 个答案:

答案 0 :(得分:7)

你不是在寻找汉密尔顿循环(即beggining = start),而是哈密顿路径,这也是一个NP完全问题。但是,由于只有26个字母,因此您的图表不是一般图表。如果你允许的符号多于26个字母,那么它实际上相当于汉密尔顿路径发现。

这是一个解决方案:你应该以相反的方式思考:

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

因此,你得到的实际上是一个多图,因为几个单词可以以相同的字母开头和结尾。那么你所看到的被称为欧拉路径:它是一条路径,它将每个边缘恰好一次。寻找欧拉路径是一个多项式问题(https://en.wikipedia.org/wiki/Eulerian_path)。它实际上可能是历史上第一个图形问题之一。

现在引用维基百科:

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

这是一种更好的方法来决定是否存在路径而不是搜索哈密尔顿路径。

答案 1 :(得分:0)

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

你可以把它解决为欧拉路径问题,它比汉密尔顿路径简单得多。

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

答案 2 :(得分:0)

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

让我们将您的单词视为有向图,其中26个顶点对应于所有字母{a,b,...,z}。

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

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

有一个着名的定理:

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

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