标签:搜索 字典 efi item with rem info build rms
word squares
you can build from them.A sequence of words forms a valid word square if the kth row and column read the exact same string, where 0 ≤ k < max(numRows, numColumns).
For example, the word sequence ["ball","area","lead","lady"]
forms a word square because each word reads the same both horizontally and vertically.
b a l l
a r e a
l e a d
l a d y
a-z
.Example 1:
Input:
["area","lead","wall","lady","ball"]
Output:
[["wall","area","lead","lady"],["ball","area","lead","lady"]]
Explanation:
The output consists of two word squares. The order of output does not matter (just the order of words in each word square matters).
Example 2:
Input:
["abat","baba","atan","atal"]
Output:
[["baba","abat","baba","atan"],["baba","abat","baba","atal"]]
思路:字典树+dfs。
根据已添加单词确定下一个单词的前缀,利用dfs搜索。
public class Solution { class TrieNode { List<String> startWith; TrieNode[] children; TrieNode() { startWith = new ArrayList<>(); children = new TrieNode[26]; } } class Trie { TrieNode root; Trie(String[] words) { root = new TrieNode(); for (String w : words) { TrieNode cur = root; for (char ch : w.toCharArray()) { int idx = ch - ‘a‘; if (cur.children[idx] == null) cur.children[idx] = new TrieNode(); cur.children[idx].startWith.add(w); cur = cur.children[idx]; } } } List<String> findByPrefix(String prefix) { List<String> ans = new ArrayList<>(); TrieNode cur = root; for (char ch : prefix.toCharArray()) { int idx = ch - ‘a‘; if (cur.children[idx] == null) return ans; cur = cur.children[idx]; } ans.addAll(cur.startWith); return ans; } } public List<List<String>> wordSquares(String[] words) { List<List<String>> ans = new ArrayList<>(); if (words == null || words.length == 0) return ans; int len = words[0].length(); Trie trie = new Trie(words); List<String> ansBuilder = new ArrayList<>(); for (String w : words) { ansBuilder.add(w); search(len, trie, ans, ansBuilder); ansBuilder.remove(ansBuilder.size() - 1); } return ans; } private void search(int len, Trie tr, List<List<String>> ans, List<String> ansBuilder) { if (ansBuilder.size() == len) { ans.add(new ArrayList<>(ansBuilder)); return; } int idx = ansBuilder.size(); StringBuilder prefixBuilder = new StringBuilder(); for (String s : ansBuilder) prefixBuilder.append(s.charAt(idx)); List<String> startWith = tr.findByPrefix(prefixBuilder.toString()); for (String sw : startWith) { ansBuilder.add(sw); search(len, tr, ans, ansBuilder); ansBuilder.remove(ansBuilder.size() - 1); } } }
标签:搜索 字典 efi item with rem info build rms
原文地址:https://www.cnblogs.com/FLAGyuri/p/12078610.html