-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathWordLadder.java
More file actions
176 lines (156 loc) · 4.83 KB
/
WordLadder.java
File metadata and controls
176 lines (156 loc) · 4.83 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
package medium;
import java.util.*;
/**
* ClassName: WordLadder.java
* Auther: chenyiAlone
* Create Time: 2019/5/9 19:26
* Description: No.127
* 思路:
* 1. Dijkstra 求最短路径,构造成邻接矩阵,矩阵中的值为权值,-1 代表此路不通
* 2. v = min() // 从未被收录的顶点中!!!!!
* 3. 记得 coll[v] = true;
* <p>
* ps:因为 Dijkstra 算法的理解不对,所以浪费了很多时间
*
*
* Given two words (beginWord and endWord), and a dictionary's word list, find the length of shortest transformation sequence from beginWord to endWord, such that:
*
* Only one letter can be changed at a time.
* Each transformed word must exist in the word list. Note that beginWord is not a transformed word.
* Note:
*
* Return 0 if there is no such transformation sequence.
* All words have the same length.
* All words contain only lowercase alphabetic characters.
* You may assume no duplicates in the word list.
* You may assume beginWord and endWord are non-empty and are not the same.
* Example 1:
*
* Input:
* beginWord = "hit",
* endWord = "cog",
* wordList = ["hot","dot","dog","lot","log","cog"]
*
* Output: 5
*
* Explanation: As one shortest transformation is "hit" -> "hot" -> "dot" -> "dog" -> "cog",
* return its length 5.
* Example 2:
*
* Input:
* beginWord = "hit"
* endWord = "cog"
* wordList = ["hot","dot","dog","lot","log"]
*
* Output: 0
*
* Explanation: The endWord "cog" is not in wordList, therefore no possible transformation.
*
*
*
*/
public class WordLadder {
private int len = -1;
private int[][] matrix = null;
private int[] dist = null;
private boolean[] coll = null;
public static void main(String[] args) {
List<String> wordList = new ArrayList<>();
String[] strs = {"hot", "dot", "dog", "lot", "log", "cog"};
for (String s : strs) {
wordList.add(s);
}
String beginWord = "hit", endWord = "cog";
int res = new WordLadder().ladderLength(beginWord, endWord, wordList);
System.out.println("res: " + res);
}
private int diff(String str1, String str2) {
int cnt = 0;
for (int i = 0; i < str1.length(); i++) {
if (str1.charAt(i) != str2.charAt(i))
cnt++;
if (cnt > 1)
break;
}
return cnt;
}
public int ladderLength(String beginWord, String endWord, List<String> wordList) {
len = wordList.size();
// len:begin
// len + 1:end
matrix = new int[len + 2][len + 2];
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix.length; j++) {
matrix[i][j] = -1;
}
}
for (int i = 0; i < len; i++) {
for (int j = i + 1; j < len; j++) {
int tmp = diff(wordList.get(i), wordList.get(j));
if (tmp <= 1) {
matrix[i][j] = tmp;
matrix[j][i] = tmp;
}
}
int d = diff(beginWord, wordList.get(i));
if (d <= 1) {
matrix[len][i] = d;
// matrix[i][len] = d;
}
d = diff(endWord, wordList.get(i));
if (d == 0) {
// matrix[len + 1][i] = d;
matrix[i][len + 1] = d;
}
}
for (int[] arr : matrix) {
for (int i : arr) {
System.out.format("%2d ", i);
}
System.out.println();
}
dist = new int[len + 2];
coll = new boolean[len + 2];
Arrays.fill(dist, Integer.MAX_VALUE);
for (int i = 0; i < matrix.length; i++) {
if (matrix[len][i] != -1) {
dist[i] = 1 + matrix[len][i];
}
}
coll[len] = true;
int v = len;
while (true) {
v = min(v);
if (v == -1) {
break;
}
System.out.println("coll, i = " + v);
coll[v] = true;
for (int i : dist) {
System.out.print(i + " ");
}
System.out.println();
for (int i = 0; i < len + 2; i++) {
if (matrix[v][i] != -1 && !coll[i] && dist[i] > dist[v] + matrix[v][i]) {
dist[i] = dist[v] + matrix[v][i];
}
}
}
return dist[len + 1] > len + 1 ? 0 : dist[len + 1];
}
private int min(int v) {
int index = -1, tmp = -1;
for (int i = 0; i < len + 2; i++) {
if (!coll[i]) {
if (tmp == -1) {
index = i;
tmp = dist[i];
} else if (dist[i] < tmp) {
tmp = dist[i];
index = i;
}
}
}
return index;
}
}