有n 个长为m+1 的字符串
来源:互联网 发布:最新网络播放器 编辑:程序博客网 时间:2024/04/27 15:18
有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()));
- }
- }
如果在text字符串数组中再加一个"babc",就将形成环路,导致一些节点自身的路径非零,环路检测会报告出错。
- 有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)
- java文件操作大全
- 找最轻的球
- 关于函数式语言的只言片语
- java 递归查找所有目录并且删除文件夹中包含temp的文件夹
- jsp进度条
- 有n 个长为m+1 的字符串
- 总结xml,适合初学者
- 2011.07.24
- 面试题—数据结构之单链表详述(基本篇)
- map/reduce 框架
- C++学习-----------虚基类的MI
- vc6.0 下载
- Boost学习
- 快速排序、堆排序、归并排序