您将获得一个字符串数组,当且仅当所有字符串都可以在一个链中连接时才返回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完全问题。
有人建议使用某种算法或任何其他解决方案吗?
答案 0 :(得分:7)
你不是在寻找汉密尔顿循环(即beggining = start),而是哈密顿路径,这也是一个NP完全问题。但是,由于只有26个字母,因此您的图表不是一般图表。如果你允许的符号多于26个字母,那么它实际上相当于汉密尔顿路径发现。
这是一个解决方案:你应该以相反的方式思考:
因此,你得到的实际上是一个多图,因为几个单词可以以相同的字母开头和结尾。那么你所看到的被称为欧拉路径:它是一条路径,它将每个边缘恰好一次。寻找欧拉路径是一个多项式问题(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的算法。