有关判定英文单词是否可以首尾相接的问题

chenqiu1024 2005-08-07 10:03:50
给定一组英文单词,要判定是否存在一种排列顺序使其首尾字母相衔接.比如a..b,c..d,d..a就可以:c..d -- d..a -- a..b
我把这题想简单了:既然能够首尾相接那就是说,一个单词的尾字母就是下一个单词的首字母,它们是成对出现的.因此可设一26元素的整数数组表示各个字母出现在单词首尾的情况,出现在词首就加1,在词尾则减1,那么如果能够首尾相接,结果一定是要么只有一个1一个-1(表示能形成一条链),要么就全是0(表示可以形成一个环).
但我忽略了这个方法只考虑了必要性而未考虑充分性,因为会有孤立环的情况出现,比如:ab bc ca xy,显然不满足,但若按上面的方法统计出现在首尾的次数则会得出能形成链的错误结论.
那么应该如何做呢?不用回溯搜索有办法吗?
...全文
1024 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
mathe 2005-08-09
  • 打赏
  • 举报
回复
不需要用回溯法,可以将问题转化为Euler回路问题.
用26个字母作为图的点,每个单词看成一条边,比如单词Love就是从字母L到E的一条边
这样我们得到一个图.构造这图的时间复杂度为O(e),其中e为边的数目,也就是单词的数目.
首先,我们需要判断这个图是否连通,只要深度优先或广度优先遍历一下图就可以了(时间复杂度为O(e)).如果图不连通,显然无法构成一个环.
在连通的条件虾,我们需要判断是否存在一个欧拉回路(或如果不需要成环,是不是存在一条欧拉路径).
我们只要判断是否所有的点的出度和入度都相同就可以了.(如果不需要回路,那么允许一个点的出度比入度大1,另外一个点入度比出度大1).这一步时间复杂度是O(1)
楼主使用的方法基本上可行了,就缺一个连通性判断算法.
ZeroGts 2005-08-09
  • 打赏
  • 举报
回复
就是哈密顿
chenqiu1024 2005-08-09
  • 打赏
  • 举报
回复
差不多了
xiaocai0001 2005-08-08
  • 打赏
  • 举报
回复
想不回溯来解决这个问题?
你的那个方法连必要性都是错的!
chenqiu1024 2005-08-08
  • 打赏
  • 举报
回复
不过遍历也就是一种搜索,只不过是做了一些预处理(建立了单词间的联系)罢了.
所以也只能把效率提高到这种程度:先用我的方法判定必要性,必要性满足之后再做遍历.也没有更多改进的余地了.
chenqiu1024 2005-08-08
  • 打赏
  • 举报
回复
嗯,这样是会高效一点.
chenqiu1024 2005-08-08
  • 打赏
  • 举报
回复
我总觉得回溯过程应该是免不了的,可能没有更高效的方案了.
xiaocai0001 2005-08-08
  • 打赏
  • 举报
回复
查找闭环这事情就比较好办了,用图的深度遍历就可以了。只要在遍历过程中,发现可以到达起点,就表明环的存在了。
chenqiu1024 2005-08-08
  • 打赏
  • 举报
回复
那查找环路的过程还是搜索吧?
xiaocai0001 2005-08-07
  • 打赏
  • 举报
回复
具体说一下,有向图这样建立,每一个单词可做为图中的一个结点,若A,B两单词,A的末尾字母与B的开头字母相同,那么就从A向B做一条有向边,以此法则遍历完所有的单词,生成一个有向图。
再用相关的图算法来查找该有向图是否有环路。若有环路,则表示这些单词可以组成环,闭环不是唯一的时候,表示单词排列顺序不唯一,可以有多种排法,每一种排法对应有向图中的一个闭环。
xiaocai0001 2005-08-07
  • 打赏
  • 举报
回复
实际上就是图论的问题
按照首尾字母组成一个有向图,判断该有向图是否存在闭环就可以了!
嘿嘿,不用想了
xiaocai0001 2005-08-07
  • 打赏
  • 举报
回复
记下,争取明天给出解答!

33,028

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧