From 1af65f166d7177914cb8222e5c6208e60fe58c68 Mon Sep 17 00:00:00 2001 From: yanglbme Date: Mon, 6 Dec 2021 09:50:39 +0800 Subject: [PATCH] feat: add solutions to lcci problem: No.17.22 No.17.22.Word Transformer --- lcci/17.22.Word Transformer/README.md | 166 +++++++++++++++++++++- lcci/17.22.Word Transformer/README_EN.md | 166 +++++++++++++++++++++- lcci/17.22.Word Transformer/Solution.cpp | 40 ++++++ lcci/17.22.Word Transformer/Solution.go | 43 ++++++ lcci/17.22.Word Transformer/Solution.java | 47 ++++++ lcci/17.22.Word Transformer/Solution.py | 24 ++++ 6 files changed, 484 insertions(+), 2 deletions(-) create mode 100644 lcci/17.22.Word Transformer/Solution.cpp create mode 100644 lcci/17.22.Word Transformer/Solution.go create mode 100644 lcci/17.22.Word Transformer/Solution.java create mode 100644 lcci/17.22.Word Transformer/Solution.py diff --git a/lcci/17.22.Word Transformer/README.md b/lcci/17.22.Word Transformer/README.md index d721b88f08cfc..c3ee7da815adf 100644 --- a/lcci/17.22.Word Transformer/README.md +++ b/lcci/17.22.Word Transformer/README.md @@ -35,6 +35,8 @@ wordList = ["hot","dot","dog","lot",&quo +DFS。 + ### **Python3** @@ -42,7 +44,30 @@ wordList = ["hot","dot","dog","lot",&quo ```python - +class Solution: + def findLadders(self, beginWord: str, endWord: str, wordList: List[str]) -> List[str]: + def check(a, b): + return sum(a[i] != b[i] for i in range(len(a))) == 1 + + def dfs(begin, end, t): + nonlocal ans + if ans: + return + if begin == end: + ans = t.copy() + return + for word in wordList: + if word in visited or not check(begin, word): + continue + visited.add(word) + t.append(word) + dfs(word, end, t) + t.pop() + + ans = [] + visited = set() + dfs(beginWord, endWord, [beginWord]) + return ans ``` ### **Java** @@ -50,7 +75,146 @@ wordList = ["hot","dot","dog","lot",&quo ```java +class Solution { + private List words; + private List ans; + private Set visited; + + public List findLadders(String beginWord, String endWord, List wordList) { + words = wordList; + ans = new ArrayList<>(); + visited = new HashSet<>(); + List t = new ArrayList<>(); + t.add(beginWord); + dfs(beginWord, endWord, t); + return ans; + } + + private void dfs(String begin, String end, List t) { + if (!ans.isEmpty()) { + return; + } + if (Objects.equals(begin, end)) { + ans = new ArrayList<>(t); + return; + } + for (String word : words) { + if (visited.contains(word) || !check(begin, word)) { + continue; + } + t.add(word); + visited.add(word); + dfs(word, end, t); + t.remove(t.size() - 1); + } + } + + private boolean check(String a, String b) { + if (a.length() != b.length()) { + return false; + } + int cnt = 0; + for (int i = 0; i < a.length(); ++i) { + if (a.charAt(i) != b.charAt(i)) { + ++cnt; + } + } + return cnt == 1; + } +} +``` + +### **C++** + +```cpp +class Solution { +public: + vector words; + vector ans; + unordered_set visited; + + vector findLadders(string beginWord, string endWord, vector& wordList) { + this->words = wordList; + ans.resize(0); + vector t; + t.push_back(beginWord); + dfs(beginWord, endWord, t); + return ans; + } + + void dfs(string begin, string end, vector& t) { + if (!ans.empty()) return; + if (begin == end) + { + ans = t; + return; + } + for (auto word : words) + { + if (visited.count(word) || !check(begin, word)) continue; + visited.insert(word); + t.push_back(word); + dfs(word, end, t); + t.pop_back(); + } + } + + bool check(string a, string b) { + if (a.size() != b.size()) return false; + int cnt = 0; + for (int i = 0; i < a.size(); ++i) + if (a[i] != b[i]) ++cnt; + return cnt == 1; + } +}; +``` +### **Go** + +```go +func findLadders(beginWord string, endWord string, wordList []string) []string { + var ans []string + visited := make(map[string]bool) + + check := func(a, b string) bool { + if len(a) != len(b) { + return false + } + cnt := 0 + for i := 0; i < len(a); i++ { + if a[i] != b[i] { + cnt++ + } + } + return cnt == 1 + } + + var dfs func(begin, end string, t []string) + dfs = func(begin, end string, t []string) { + if len(ans) > 0 { + return + } + if begin == end { + ans = make([]string, len(t)) + copy(ans, t) + return + } + for _, word := range wordList { + if visited[word] || !check(begin, word) { + continue + } + t = append(t, word) + visited[word] = true + dfs(word, end, t) + t = t[:len(t)-1] + } + } + + var t []string + t = append(t, beginWord) + dfs(beginWord, endWord, t) + return ans +} ``` ### **...** diff --git a/lcci/17.22.Word Transformer/README_EN.md b/lcci/17.22.Word Transformer/README_EN.md index 77f9ead091abe..218f687395af5 100644 --- a/lcci/17.22.Word Transformer/README_EN.md +++ b/lcci/17.22.Word Transformer/README_EN.md @@ -50,18 +50,182 @@ wordList = ["hot","dot","dog","lot",&quo ## Solutions +DFS. + ### **Python3** ```python - +class Solution: + def findLadders(self, beginWord: str, endWord: str, wordList: List[str]) -> List[str]: + def check(a, b): + return sum(a[i] != b[i] for i in range(len(a))) == 1 + + def dfs(begin, end, t): + nonlocal ans + if ans: + return + if begin == end: + ans = t.copy() + return + for word in wordList: + if word in visited or not check(begin, word): + continue + visited.add(word) + t.append(word) + dfs(word, end, t) + t.pop() + + ans = [] + visited = set() + dfs(beginWord, endWord, [beginWord]) + return ans ``` ### **Java** ```java +class Solution { + private List words; + private List ans; + private Set visited; + + public List findLadders(String beginWord, String endWord, List wordList) { + words = wordList; + ans = new ArrayList<>(); + visited = new HashSet<>(); + List t = new ArrayList<>(); + t.add(beginWord); + dfs(beginWord, endWord, t); + return ans; + } + + private void dfs(String begin, String end, List t) { + if (!ans.isEmpty()) { + return; + } + if (Objects.equals(begin, end)) { + ans = new ArrayList<>(t); + return; + } + for (String word : words) { + if (visited.contains(word) || !check(begin, word)) { + continue; + } + t.add(word); + visited.add(word); + dfs(word, end, t); + t.remove(t.size() - 1); + } + } + + private boolean check(String a, String b) { + if (a.length() != b.length()) { + return false; + } + int cnt = 0; + for (int i = 0; i < a.length(); ++i) { + if (a.charAt(i) != b.charAt(i)) { + ++cnt; + } + } + return cnt == 1; + } +} +``` + +### **C++** + +```cpp +class Solution { +public: + vector words; + vector ans; + unordered_set visited; + + vector findLadders(string beginWord, string endWord, vector& wordList) { + this->words = wordList; + ans.resize(0); + vector t; + t.push_back(beginWord); + dfs(beginWord, endWord, t); + return ans; + } + + void dfs(string begin, string end, vector& t) { + if (!ans.empty()) return; + if (begin == end) + { + ans = t; + return; + } + for (auto word : words) + { + if (visited.count(word) || !check(begin, word)) continue; + visited.insert(word); + t.push_back(word); + dfs(word, end, t); + t.pop_back(); + } + } + + bool check(string a, string b) { + if (a.size() != b.size()) return false; + int cnt = 0; + for (int i = 0; i < a.size(); ++i) + if (a[i] != b[i]) ++cnt; + return cnt == 1; + } +}; +``` +### **Go** + +```go +func findLadders(beginWord string, endWord string, wordList []string) []string { + var ans []string + visited := make(map[string]bool) + + check := func(a, b string) bool { + if len(a) != len(b) { + return false + } + cnt := 0 + for i := 0; i < len(a); i++ { + if a[i] != b[i] { + cnt++ + } + } + return cnt == 1 + } + + var dfs func(begin, end string, t []string) + dfs = func(begin, end string, t []string) { + if len(ans) > 0 { + return + } + if begin == end { + ans = make([]string, len(t)) + copy(ans, t) + return + } + for _, word := range wordList { + if visited[word] || !check(begin, word) { + continue + } + t = append(t, word) + visited[word] = true + dfs(word, end, t) + t = t[:len(t)-1] + } + } + + var t []string + t = append(t, beginWord) + dfs(beginWord, endWord, t) + return ans +} ``` ### **...** diff --git a/lcci/17.22.Word Transformer/Solution.cpp b/lcci/17.22.Word Transformer/Solution.cpp new file mode 100644 index 0000000000000..a5926ae2a2ade --- /dev/null +++ b/lcci/17.22.Word Transformer/Solution.cpp @@ -0,0 +1,40 @@ +class Solution { +public: + vector words; + vector ans; + unordered_set visited; + + vector findLadders(string beginWord, string endWord, vector& wordList) { + this->words = wordList; + ans.resize(0); + vector t; + t.push_back(beginWord); + dfs(beginWord, endWord, t); + return ans; + } + + void dfs(string begin, string end, vector& t) { + if (!ans.empty()) return; + if (begin == end) + { + ans = t; + return; + } + for (auto word : words) + { + if (visited.count(word) || !check(begin, word)) continue; + visited.insert(word); + t.push_back(word); + dfs(word, end, t); + t.pop_back(); + } + } + + bool check(string a, string b) { + if (a.size() != b.size()) return false; + int cnt = 0; + for (int i = 0; i < a.size(); ++i) + if (a[i] != b[i]) ++cnt; + return cnt == 1; + } +}; \ No newline at end of file diff --git a/lcci/17.22.Word Transformer/Solution.go b/lcci/17.22.Word Transformer/Solution.go new file mode 100644 index 0000000000000..9053efe1532c8 --- /dev/null +++ b/lcci/17.22.Word Transformer/Solution.go @@ -0,0 +1,43 @@ +func findLadders(beginWord string, endWord string, wordList []string) []string { + var ans []string + visited := make(map[string]bool) + + check := func(a, b string) bool { + if len(a) != len(b) { + return false + } + cnt := 0 + for i := 0; i < len(a); i++ { + if a[i] != b[i] { + cnt++ + } + } + return cnt == 1 + } + + var dfs func(begin, end string, t []string) + dfs = func(begin, end string, t []string) { + if len(ans) > 0 { + return + } + if begin == end { + ans = make([]string, len(t)) + copy(ans, t) + return + } + for _, word := range wordList { + if visited[word] || !check(begin, word) { + continue + } + t = append(t, word) + visited[word] = true + dfs(word, end, t) + t = t[:len(t)-1] + } + } + + var t []string + t = append(t, beginWord) + dfs(beginWord, endWord, t) + return ans +} \ No newline at end of file diff --git a/lcci/17.22.Word Transformer/Solution.java b/lcci/17.22.Word Transformer/Solution.java new file mode 100644 index 0000000000000..b270b52e38dab --- /dev/null +++ b/lcci/17.22.Word Transformer/Solution.java @@ -0,0 +1,47 @@ +class Solution { + private List words; + private List ans; + private Set visited; + + public List findLadders(String beginWord, String endWord, List wordList) { + words = wordList; + ans = new ArrayList<>(); + visited = new HashSet<>(); + List t = new ArrayList<>(); + t.add(beginWord); + dfs(beginWord, endWord, t); + return ans; + } + + private void dfs(String begin, String end, List t) { + if (!ans.isEmpty()) { + return; + } + if (Objects.equals(begin, end)) { + ans = new ArrayList<>(t); + return; + } + for (String word : words) { + if (visited.contains(word) || !check(begin, word)) { + continue; + } + t.add(word); + visited.add(word); + dfs(word, end, t); + t.remove(t.size() - 1); + } + } + + private boolean check(String a, String b) { + if (a.length() != b.length()) { + return false; + } + int cnt = 0; + for (int i = 0; i < a.length(); ++i) { + if (a.charAt(i) != b.charAt(i)) { + ++cnt; + } + } + return cnt == 1; + } +} \ No newline at end of file diff --git a/lcci/17.22.Word Transformer/Solution.py b/lcci/17.22.Word Transformer/Solution.py new file mode 100644 index 0000000000000..0f67dc4be222b --- /dev/null +++ b/lcci/17.22.Word Transformer/Solution.py @@ -0,0 +1,24 @@ +class Solution: + def findLadders(self, beginWord: str, endWord: str, wordList: List[str]) -> List[str]: + def check(a, b): + return sum(a[i] != b[i] for i in range(len(a))) == 1 + + def dfs(begin, end, t): + nonlocal ans + if ans: + return + if begin == end: + ans = t.copy() + return + for word in wordList: + if word in visited or not check(begin, word): + continue + visited.add(word) + t.append(word) + dfs(word, end, t) + t.pop() + + ans = [] + visited = set() + dfs(beginWord, endWord, [beginWord]) + return ans