有n 个长为m+1 的字符串
来源:互联网 发布:java中的collection 编辑:程序博客网 时间:2024/04/27 13:24
有n 个长为m+1 的字符串,如果某个字符串的最后m 个字符与某个字符串的前m 个字符匹配,则两个字符串可以联接,问这n 个字符串最多可以连成一个多长的字符串,如果出现循环,则返回错误。
分析一下,将各个字符串作为一个节点,首尾链接就好比是一条边,将两个节点连接起来,于是问题就变成一个有关图的路径长度的问题。链接所得的字符串最长长度即为从图的某个节点出发所能得到的最长路径问题,与最短路径类似,可以应用弗洛伊德算法求解。对于循环,即可认为各个节点通过其他节点又回到自己,反应在路径长度上,就表示某个节点到自己节点的路径大于零(注:初始化个节点到自己的长度为零)。
public class MaxCatenate { public static void main(String[] args) { String[] text = new String[]{ "abcd", "bcde", "cdea", "deab", "eaba", "abab", "deac", "cdei", "bcdf", "cdfi", "dfic", "cdfk", "bcdg", }; maxCatenate(text); } public static void maxCatenate(String[] text) { int[][] G = new int[text.length][text.length]; for(int i=0; i<G.length; i++) { String suffix = text[i].substring(1); for(int j=0; j<G.length; j++) if(text[j].indexOf(suffix)==0) G[i][j] = 1; } for(int k=0; k<G.length; k++) for(int i=0; i<G.length; i++) for(int j=0; j<G.length; j++) if(G[i][k]!=0&&G[k][j]!=0) { int dist = G[i][k] + G[k][j]; if(dist>G[i][j]) { G[i][j] = dist; } } for(int i=0; i<G.length; i++) if(G[i][i]>1) { System.out.println("circle is deteted!"); return; } int max = 0; for(int i=0; i<G.length; i++) for(int j=0; j<G.length; j++) max = Math.max(max, G[i][j]); System.out.println("Max length is " + (max+text[0].length())); } }
- 有n 个长为m+1 的字符串
- 有n 个长为m+1 的字符串
- 有n个长为m+1的字符串
- 31. 百度面试题:有n个长为m+1的字符串
- 有n 个长为m+1 的字符串,求前后m个字符匹配所能形成的最长字符串链:利用弗洛伊德算法求最长路径
- 有n 个长为m+1 的字符串,求前后m个字符匹配所能形成的最长字符串链
- 算法习题37:有n个长为m+1的字符串, 如果某个字符串的最后m个字符与某个字符串的前m个字符匹配,则两个字符串可以联接
- 有n个长为m+1的字符串,如果某个字符串的最后m个字符与某个字符串的前m个字符匹配,则两个字符串可以联接
- 微软100题(37)n个长为m+1的字符串的连接
- 有n个长为m+1的字符串,如果某个字符串的最后m个字符与某个字符串的前m个字符匹配,则两个字符串可以联接,问这n个字符串最多可以连成一个多长的字符串,如果出现循环,则返回错误。
- 有n 个长为m+1 的字符串,如果某个字符串的最后m 个字符与某个字符串的前m 个字符 匹配,则两个字符串可以联接,问这n 个字符串最多可以连成一个多长的字符串
- 有n 个长为m+1 的字符串,如果某个字符串的最后m 个字符与某个字符串的前m 个字符匹配,则两个字符串可以联接,问这n 个字符串最多可以连成一个多长的字符串,如果出现循环,则返回错误
- 时间O(n)/空间O(1)实现长n字符串前m个移到末尾
- [每日练习]数组有N+M个数字, 数字的范围为1 ... N, 打印重复的元素, 要求O(M + N), 不可以用额外的空间
- 模式匹配(pattern matching)问题:判断一个长为n的字符串X中是否包含常为m的字串Y(m<=n)
- 输入n,m,从1-n个数字里输出和为m的组合
- 有2n个硬币和一个天平,其中有两个假硬币一个质量为m+1,一个质量为m-1,其余质量都为m,用O(logn)的时间复杂度找到这两个假硬币。
- 将整数m拆分为n个数字的有序拆分方案数为C(m-1,n-1)
- zTree v3.1获取选中节点的值并赋给隐藏域
- 解决WIN2008 R2 x64未注册Microsoft.Jet.OLEDB.4.0程序错误
- JQUERY获取text,areatext,radio,checkbox,select值
- 文件上传js限制
- 如何理解GPO版本号
- 有n 个长为m+1 的字符串
- 分享8年开发经验,浅谈个人发展经历,明确自己发展方向
- 堆排序
- winapi遍历文件夹,统计c/c++代码行数 (包括注释)
- 注册认证js控制
- Nginx配置文件详解
- 华为笑话一则
- Effective C++读书笔记3
- 光标全选择 js