ARTS是什么?
Algorithm:每周至少作一个leetcode的算法题;
Review:阅读并点评至少一篇英文技术文章;
Tip:学习至少一个技术技巧;
Share:分享一篇有观点和思考的技术文章。html
LeetCode 126. Word Ladder IIjava
思路分析
这道题是一道经典的搜索问题,难点仍是在于优化。题目要求找出全部可能的解,咱们能够把这道题转化为一个无向图,每一个单词表示的是图上的节点,保证每一个单词的邻居单词跟这个单词只有一个字母的不一样,若是用暴力的深度优先搜索,咱们在图上选中起始节点和终止节点,考虑全部的从起点到终点的可能的路径,这么作会大大增长搜索所消耗的时间,那么怎么优化呢?和咱们以前经常提到的增长记忆化不一样的是,这里咱们考虑使用标记法,由于在搜索的时候,咱们要保证咱们当前的搜索方向是朝着终点去的,什么意思,就是说,下一个咱们要去的节点到终点的距离要比到当前咱们所在节点到终点的距离更近,根据这么一个思路咱们能够进行两次搜索,第一次仅仅是标记,第二次才是搜索可能的答案。这里标记使用的是广度优先搜索,为何不使用深度优先搜索?由于这个图中可能存在环,深度优先搜索无法保证标记的正确性。搜索答案的时候咱们可使用深度优先搜索,也能够广度,这里我使用了深搜。python
参考代码算法
public List<List<String>> findLadders(String beginWord, String endWord, List<String> wordList) {
if (beginWord.equals(endWord) || !wordList.contains(endWord)) {
return new ArrayList<>();
}
List<List<String>> results = new ArrayList<>();
// bfs mark
Map<String, Integer> memo = new HashMap<>();
for (String word : wordList) {
memo.put(word, -1);
}
memo.put(beginWord, -1);
memo.put(endWord, 0);
bfsMark(endWord, memo);
System.out.println(memo);
// dfs find path
List<String> path = new ArrayList<String>();
path.add(beginWord);
dfs(memo, beginWord, endWord, wordList, path, results, memo.get(beginWord));
return results;
}
private void dfs(Map<String, Integer> memo, String curWord, String endWord, List<String> wordList, List<String> path, List<List<String>> results, int step) {
if (curWord.equals(endWord)) {
results.add(new ArrayList<String>(path));
}
if (step <= 0) {
return;
}
for (String word : wordList) {
if (memo.get(word) == step - 1 && checkDiff(word, curWord)) {
path.add(word);
dfs(memo, word, endWord, wordList, path, results, step - 1);
path.remove(path.size() - 1);
}
}
}
private boolean checkDiff(String a, String b) {
int count = 0;
for (int i = 0; i < a.length(); ++i) {
if (a.charAt(i) != b.charAt(i)) {
count++;
}
if (count > 1) {
return false;
}
}
return count == 1;
}
private void bfsMark(String endWord, Map<String, Integer> memo) {
Queue<String> queue = new LinkedList<>();
queue.offer(endWord);
int stepCount = 0;
while (!queue.isEmpty()) {
int size = queue.size();
stepCount++;
for (int i = 0; i < size; ++i) {
String curWord = queue.poll();
char[] curWordArr = curWord.toCharArray();
for (char r = 'a'; r <= 'z'; ++r) {
for (int j = 0; j < curWordArr.length; ++j) {
char tmp = curWordArr[j];
curWordArr[j] = r;
String newWord = String.valueOf(curWordArr);
if (memo.containsKey(newWord) && memo.get(newWord) == -1) {
queue.offer(newWord);
memo.put(newWord, stepCount);
}
curWordArr[j] = tmp;
}
}
}
}
}
复制代码
一篇关于如何问别人技术问题的文章:
bash
How To Ask Questions The Smart Way网络
问问题也是一门学问,特别是在网上问问题,文章读起来不是太好懂,但仍是理解了、学到了很多,总结一下重点内容:app
这周接触了 openresty,记录一下它在 Mac 上的安装和启动post
安装(使用 homebrew):学习
>$ brew tap openresty/brew
>$ brew install openresty
复制代码
启动:测试
>$ openresty -p `...` -c ...
复制代码
中止:
>$ openresty -s quit -p `...` -c ...
复制代码
再来记录几个以前比较模糊,可是如今懂了的 Python 基础知识点:
import copy
a = [[1,2],2,3,4]
b = copy.copy(a)
b.append(1)
b[0].append(3)
print(a)
print(b)
-----------------------------
[[1, 2, 3], 2, 3, 4]
[[1, 2, 3], 2, 3, 4, 1]
复制代码
这周最后仍是来聊聊算法,拓扑排序