1 package strings;
2
3 /**
4 * @author ycsun E-mail:stevesun521@gmail.com
5 * @version 创建时间:2012-10-2 下午8:36:17 类说明
6 */
7 public class MaxCatenate {
8
9 /*
10 * 有n 个长为m+1 的字符串,如果某个字符串的最后m 个字符与某个字符串的前m 个字符匹配,则两个字符串可以联接, 问这n
11 * 个字符串最多可以连成一个多长的字符串,如果出现循环,则返回错误。
12 */
13 private int m = 1;
14 private int[][] adjMatrix;
15 private int vertexnum = 0;
16 private String[] text;
17 private int[][] d;
18 private int[][] path;
19 private int maxPosX, maxPosY;
20 private int maxLenth = Integer.MIN_VALUE;
21
22 public MaxCatenate(int m, String[] text) {
23 this.m = m;
24 this.vertexnum = text.length;
25 this.adjMatrix = new int[vertexnum][vertexnum];
26 this.d = new int[vertexnum][vertexnum];
27 this.text = text;
28 this.path = new int[vertexnum][vertexnum];
29 }
30
31 public boolean hasEdge(String strA, String strB) {
32 boolean result = false;
33 String suffix = strA.substring(strA.length() - m);
34 result = strB.startsWith(suffix);
35 return result;
36 }
37
38 public void createAdjMatrix() {
39 for (int i = 0; i < vertexnum; i++) {
40 for (int j = 0; j < vertexnum; j++) {
41 path[i][j] = -1;
42 if (hasEdge(text[i], text[j])) {
43 adjMatrix[i][j] = 1;
44 this.d[i][j] = 1;
45 } else {
46 adjMatrix[i][j] = Integer.MIN_VALUE;
47 this.d[i][j] = Integer.MIN_VALUE;
48 }
49 }
50 }
51 }
52
53 public void longestFloyd() {
54 for (int i = 0; i < vertexnum; i++) {
55 for (int j = 0; j < vertexnum; j++) {
56 for (int k = 0; k < vertexnum; k++) {
57 if (d[j][i] > Integer.MIN_VALUE
58 && d[i][k] > Integer.MIN_VALUE
59 && d[j][i] + d[i][k] > d[j][k]) {
60 d[j][k] = d[j][i] + d[i][k];
61 path[j][k] = i;
62 if (maxLenth < d[j][k]) {
63 maxLenth = d[j][k];
64 maxPosX = j;
65 maxPosY = k;
66 }
67 }
68 }
69 }
70 }
71 }
72
73 public void hasCircle() {
74 for (int i = 0; i < vertexnum; i++) {
75 if (d[i][i] > Integer.MIN_VALUE) {
76 System.out.println("Have a circle");
77 break;
78 }
79 }
80 }
81
82 public void printMaxLenth() {
83 System.out.println("Max length is " + maxLenth);
84 }
85
86 public void printMaxLenthPath() {
87 System.out.print(text[maxPosX] + "-->");
88 printMaxLenthPath(maxPosX, maxPosY);
89 System.out.println(text[maxPosY]);
90 }
91
92 private void printMaxLenthPath(int x, int y) {
93 int k = path[x][y];
94 if (k == -1)
95 return;
96 printMaxLenthPath(x, k);
97 System.out.print(text[k] + "-->");
98 printMaxLenthPath(k, y);
99 }
100
101 public void printMatrix() {
102 for (int i = 0; i < vertexnum; i++) {
103 for (int j = 0; j < vertexnum; j++) {
104 if (adjMatrix[i][j] > Integer.MIN_VALUE) {
105 System.out.print(adjMatrix[i][j] + " ");
106 } else {
107 System.out.print("* ");
108 }
109
110 }
111 System.out.println();
112 }
113 System.out.println("------------------------------------------------");
114 for (int i = 0; i < vertexnum; i++) {
115 for (int j = 0; j < vertexnum; j++) {
116 if (d[i][j] > Integer.MIN_VALUE) {
117 System.out.print(d[i][j] + " ");
118 } else {
119 System.out.print("* ");
120 }
121 }
122 System.out.println();
123 }
124 }
125
126 public static void main(String[] args) {
127 String[] text = new String[] { "abcd", "qwer", "bcde", "wert", "erty",
128 "cdeh", "tyui", "rtyu", };
129 MaxCatenate maxCatenate = new MaxCatenate(3, text);
130 maxCatenate.createAdjMatrix();
131 maxCatenate.longestFloyd();
132 maxCatenate.printMaxLenth();
133 maxCatenate.printMaxLenthPath();
134 }
135 }