Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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‎

Lines changed: 165 additions & 1 deletion
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‎

Lines changed: 165 additions & 1 deletion
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)

AltStyle によって変換されたページ (->オリジナル) /