Skip to content

Commit 1af65f1

Browse files
committed
feat: add solutions to lcci problem: No.17.22
No.17.22.Word Transformer
1 parent 76cfdc9 commit 1af65f1

File tree

6 files changed

+484
-2
lines changed

6 files changed

+484
-2
lines changed

lcci/17.22.Word Transformer/README.md

+165-1
Original file line numberDiff line numberDiff line change
@@ -35,22 +35,186 @@ wordList = ["hot","dot","dog","lot",&quo
3535

3636
<!-- 这里可写通用的实现逻辑 -->
3737

38+
DFS。
39+
3840
<!-- tabs:start -->
3941

4042
### **Python3**
4143

4244
<!-- 这里可写当前语言的特殊实现逻辑 -->
4345

4446
```python
45-
47+
class Solution:
48+
def findLadders(self, beginWord: str, endWord: str, wordList: List[str]) -> List[str]:
49+
def check(a, b):
50+
return sum(a[i] != b[i] for i in range(len(a))) == 1
51+
52+
def dfs(begin, end, t):
53+
nonlocal ans
54+
if ans:
55+
return
56+
if begin == end:
57+
ans = t.copy()
58+
return
59+
for word in wordList:
60+
if word in visited or not check(begin, word):
61+
continue
62+
visited.add(word)
63+
t.append(word)
64+
dfs(word, end, t)
65+
t.pop()
66+
67+
ans = []
68+
visited = set()
69+
dfs(beginWord, endWord, [beginWord])
70+
return ans
4671
```
4772

4873
### **Java**
4974

5075
<!-- 这里可写当前语言的特殊实现逻辑 -->
5176

5277
```java
78+
class Solution {
79+
private List<String> words;
80+
private List<String> ans;
81+
private Set<String> visited;
82+
83+
public List<String> findLadders(String beginWord, String endWord, List<String> wordList) {
84+
words = wordList;
85+
ans = new ArrayList<>();
86+
visited = new HashSet<>();
87+
List<String> t = new ArrayList<>();
88+
t.add(beginWord);
89+
dfs(beginWord, endWord, t);
90+
return ans;
91+
}
92+
93+
private void dfs(String begin, String end, List<String> t) {
94+
if (!ans.isEmpty()) {
95+
return;
96+
}
97+
if (Objects.equals(begin, end)) {
98+
ans = new ArrayList<>(t);
99+
return;
100+
}
101+
for (String word : words) {
102+
if (visited.contains(word) || !check(begin, word)) {
103+
continue;
104+
}
105+
t.add(word);
106+
visited.add(word);
107+
dfs(word, end, t);
108+
t.remove(t.size() - 1);
109+
}
110+
}
111+
112+
private boolean check(String a, String b) {
113+
if (a.length() != b.length()) {
114+
return false;
115+
}
116+
int cnt = 0;
117+
for (int i = 0; i < a.length(); ++i) {
118+
if (a.charAt(i) != b.charAt(i)) {
119+
++cnt;
120+
}
121+
}
122+
return cnt == 1;
123+
}
124+
}
125+
```
126+
127+
### **C++**
128+
129+
```cpp
130+
class Solution {
131+
public:
132+
vector<string> words;
133+
vector<string> ans;
134+
unordered_set<string> visited;
135+
136+
vector<string> findLadders(string beginWord, string endWord, vector<string>& wordList) {
137+
this->words = wordList;
138+
ans.resize(0);
139+
vector<string> t;
140+
t.push_back(beginWord);
141+
dfs(beginWord, endWord, t);
142+
return ans;
143+
}
144+
145+
void dfs(string begin, string end, vector<string>& t) {
146+
if (!ans.empty()) return;
147+
if (begin == end)
148+
{
149+
ans = t;
150+
return;
151+
}
152+
for (auto word : words)
153+
{
154+
if (visited.count(word) || !check(begin, word)) continue;
155+
visited.insert(word);
156+
t.push_back(word);
157+
dfs(word, end, t);
158+
t.pop_back();
159+
}
160+
}
161+
162+
bool check(string a, string b) {
163+
if (a.size() != b.size()) return false;
164+
int cnt = 0;
165+
for (int i = 0; i < a.size(); ++i)
166+
if (a[i] != b[i]) ++cnt;
167+
return cnt == 1;
168+
}
169+
};
170+
```
53171
172+
### **Go**
173+
174+
```go
175+
func findLadders(beginWord string, endWord string, wordList []string) []string {
176+
var ans []string
177+
visited := make(map[string]bool)
178+
179+
check := func(a, b string) bool {
180+
if len(a) != len(b) {
181+
return false
182+
}
183+
cnt := 0
184+
for i := 0; i < len(a); i++ {
185+
if a[i] != b[i] {
186+
cnt++
187+
}
188+
}
189+
return cnt == 1
190+
}
191+
192+
var dfs func(begin, end string, t []string)
193+
dfs = func(begin, end string, t []string) {
194+
if len(ans) > 0 {
195+
return
196+
}
197+
if begin == end {
198+
ans = make([]string, len(t))
199+
copy(ans, t)
200+
return
201+
}
202+
for _, word := range wordList {
203+
if visited[word] || !check(begin, word) {
204+
continue
205+
}
206+
t = append(t, word)
207+
visited[word] = true
208+
dfs(word, end, t)
209+
t = t[:len(t)-1]
210+
}
211+
}
212+
213+
var t []string
214+
t = append(t, beginWord)
215+
dfs(beginWord, endWord, t)
216+
return ans
217+
}
54218
```
55219

56220
### **...**

lcci/17.22.Word Transformer/README_EN.md

+165-1
Original file line numberDiff line numberDiff line change
@@ -50,18 +50,182 @@ wordList = [&quot;hot&quot;,&quot;dot&quot;,&quot;dog&quot;,&quot;lot&quot;,&quo
5050

5151
## Solutions
5252

53+
DFS.
54+
5355
<!-- tabs:start -->
5456

5557
### **Python3**
5658

5759
```python
58-
60+
class Solution:
61+
def findLadders(self, beginWord: str, endWord: str, wordList: List[str]) -> List[str]:
62+
def check(a, b):
63+
return sum(a[i] != b[i] for i in range(len(a))) == 1
64+
65+
def dfs(begin, end, t):
66+
nonlocal ans
67+
if ans:
68+
return
69+
if begin == end:
70+
ans = t.copy()
71+
return
72+
for word in wordList:
73+
if word in visited or not check(begin, word):
74+
continue
75+
visited.add(word)
76+
t.append(word)
77+
dfs(word, end, t)
78+
t.pop()
79+
80+
ans = []
81+
visited = set()
82+
dfs(beginWord, endWord, [beginWord])
83+
return ans
5984
```
6085

6186
### **Java**
6287

6388
```java
89+
class Solution {
90+
private List<String> words;
91+
private List<String> ans;
92+
private Set<String> visited;
93+
94+
public List<String> findLadders(String beginWord, String endWord, List<String> wordList) {
95+
words = wordList;
96+
ans = new ArrayList<>();
97+
visited = new HashSet<>();
98+
List<String> t = new ArrayList<>();
99+
t.add(beginWord);
100+
dfs(beginWord, endWord, t);
101+
return ans;
102+
}
103+
104+
private void dfs(String begin, String end, List<String> t) {
105+
if (!ans.isEmpty()) {
106+
return;
107+
}
108+
if (Objects.equals(begin, end)) {
109+
ans = new ArrayList<>(t);
110+
return;
111+
}
112+
for (String word : words) {
113+
if (visited.contains(word) || !check(begin, word)) {
114+
continue;
115+
}
116+
t.add(word);
117+
visited.add(word);
118+
dfs(word, end, t);
119+
t.remove(t.size() - 1);
120+
}
121+
}
122+
123+
private boolean check(String a, String b) {
124+
if (a.length() != b.length()) {
125+
return false;
126+
}
127+
int cnt = 0;
128+
for (int i = 0; i < a.length(); ++i) {
129+
if (a.charAt(i) != b.charAt(i)) {
130+
++cnt;
131+
}
132+
}
133+
return cnt == 1;
134+
}
135+
}
136+
```
137+
138+
### **C++**
139+
140+
```cpp
141+
class Solution {
142+
public:
143+
vector<string> words;
144+
vector<string> ans;
145+
unordered_set<string> visited;
146+
147+
vector<string> findLadders(string beginWord, string endWord, vector<string>& wordList) {
148+
this->words = wordList;
149+
ans.resize(0);
150+
vector<string> t;
151+
t.push_back(beginWord);
152+
dfs(beginWord, endWord, t);
153+
return ans;
154+
}
155+
156+
void dfs(string begin, string end, vector<string>& t) {
157+
if (!ans.empty()) return;
158+
if (begin == end)
159+
{
160+
ans = t;
161+
return;
162+
}
163+
for (auto word : words)
164+
{
165+
if (visited.count(word) || !check(begin, word)) continue;
166+
visited.insert(word);
167+
t.push_back(word);
168+
dfs(word, end, t);
169+
t.pop_back();
170+
}
171+
}
172+
173+
bool check(string a, string b) {
174+
if (a.size() != b.size()) return false;
175+
int cnt = 0;
176+
for (int i = 0; i < a.size(); ++i)
177+
if (a[i] != b[i]) ++cnt;
178+
return cnt == 1;
179+
}
180+
};
181+
```
64182
183+
### **Go**
184+
185+
```go
186+
func findLadders(beginWord string, endWord string, wordList []string) []string {
187+
var ans []string
188+
visited := make(map[string]bool)
189+
190+
check := func(a, b string) bool {
191+
if len(a) != len(b) {
192+
return false
193+
}
194+
cnt := 0
195+
for i := 0; i < len(a); i++ {
196+
if a[i] != b[i] {
197+
cnt++
198+
}
199+
}
200+
return cnt == 1
201+
}
202+
203+
var dfs func(begin, end string, t []string)
204+
dfs = func(begin, end string, t []string) {
205+
if len(ans) > 0 {
206+
return
207+
}
208+
if begin == end {
209+
ans = make([]string, len(t))
210+
copy(ans, t)
211+
return
212+
}
213+
for _, word := range wordList {
214+
if visited[word] || !check(begin, word) {
215+
continue
216+
}
217+
t = append(t, word)
218+
visited[word] = true
219+
dfs(word, end, t)
220+
t = t[:len(t)-1]
221+
}
222+
}
223+
224+
var t []string
225+
t = append(t, beginWord)
226+
dfs(beginWord, endWord, t)
227+
return ans
228+
}
65229
```
66230

67231
### **...**

0 commit comments

Comments
 (0)