425 Word Squares

题目描述请见leetcode 425

w a l l
a r e a
l e a d
l a d y

在给定的词典里,找到一些单词,组成一个square, 第i行和第i列一样。
(0,0) 这个点找到满足条件的,我们选择w。
(0,1) 我们要满足wa, a都可以作为开头的部分。
(0,2) 我们要满足wal, l都可以作为开头的部分。

按照代码的逻辑,走一遍test case, 填写好prefix[]每一步被更新的样子。

第0行。     
开始    prefix[root, root, root, root] 
(0, 0) prefix[root, root, root, root]  (root.w, root.w)  root[0] = w, root[0] = w
(0, 1) prefix[w, root, root, root]     (w.a, root.a)     root[0] = wa, root[1] = a
(0, 2) prefix[wa, a, root, root]     (wa.l, root.l)     root[0] = wal, root[2] = l
(0, 3) prefix[wal, a, l, root]     (wal.l, root.l)     root[0] = wall, root[3] = l
结束     prefix[wall, a, l, l] 

第1行。
开始    prefix[wall, a, l, l]

(1,1)  prefix[wall, a, l, l]       (a.r, a.r)     root[1] = ar,  root[1] = ar
(1,2)  prefix[wall, ar, l, l]      (ar.e, l.e)    root[1] = are, root[2] = le
(1,3)  prefix[wall, are, le, l]      (are.a, l.a)    root[1] = area, root[3] =la
结束    prefix[wall, area, le, la]   
public class Solution {
    class Node{
        String word = null;
        Node[] kids = new Node[26];
    }
    
    private Node root = new Node();
    
    private void buildTrie(String word, Node par){
        for(char c: word.toCharArray()){
            int idx = c -'a';
            if(par.kids[idx] == null) par.kids[idx] = new Node();
            par = par.kids[idx];
        }
        par.word = word;
    }
    
    private void findAllSquares(int row , int col, Node[] prefix, List<List<String>> res){
        if(row == prefix.length){
            List<String> temp = new ArrayList<String>();
            for(int i=0; i<prefix.length; i++){
                temp.add(prefix[i].word);
            }
            res.add(temp);
        } else if(col < prefix.length){ 
            Node currow = prefix[row];  
            Node curcol = prefix[col];
            for(int i=0; i<26; i++){
                if(currow.kids[i] != null && curcol.kids[i] != null){   // 同一层从左向右走的时候
                    prefix[row] =  currow.kids[i];      //  prefix[row]会不断增长,直到最后形成以个单词
                    prefix[col] =  curcol.kids[i];      //  prefix[col]相应位置长度加一,更新prefix
                    findAllSquares(row, col+1, prefix, res);   
                }
            }
            prefix[row] = currow;       // reset back  重新进行下一次的搜索。
            prefix[col] = curcol;
        } else {
            findAllSquares(row+1, row+1, prefix, res);
        }
    }
    
    public List<List<String>> wordSquares(String[] words) {
        List<List<String>> res = new ArrayList<List<String>>();
        if(words == null || words.length == 0 || words[0] == null || words[0].length() == 0) return res;
        for(String word: words){
            buildTrie(word, root);
        }
        Node[] prefix = new Node[words[0].length()];
        Arrays.fill(prefix, root);
        findAllSquares(0, 0, prefix, res);
        return res;
    }
}

你的code
记录日常刷leetcode的思路和总结。

你的code是面向面试编程的,收集和整理leetcode discussion里个人认为的最优且最符合我个人思维逻辑的解...

12 声望
4 粉丝
0 条评论
推荐阅读
287. Find the Duplicate Number
{代码...} {代码...}

大米中的大米阅读 1.2k

Java12的新特性
Java语言特性系列Java5的新特性Java6的新特性Java7的新特性Java8的新特性Java9的新特性Java10的新特性Java11的新特性Java12的新特性Java13的新特性Java14的新特性Java15的新特性Java16的新特性Java17的新特性Java...

codecraft63阅读 11.9k

Java8的新特性
Java语言特性系列Java5的新特性Java6的新特性Java7的新特性Java8的新特性Java9的新特性Java10的新特性Java11的新特性Java12的新特性Java13的新特性Java14的新特性Java15的新特性Java16的新特性Java17的新特性Java...

codecraft32阅读 24.7k评论 1

一文搞懂秒杀系统,欢迎参与开源,提交PR,提高竞争力。早日上岸,升职加薪。
前言秒杀和高并发是面试的高频考点,也是我们做电商项目必知必会的场景。欢迎大家参与我们的开源项目,提交PR,提高竞争力。早日上岸,升职加薪。知识点详解秒杀系统架构图秒杀流程图秒杀系统设计这篇文章一万多...

王中阳Go34阅读 2.6k评论 1

封面图
Java11的新特性
Java语言特性系列Java5的新特性Java6的新特性Java7的新特性Java8的新特性Java9的新特性Java10的新特性Java11的新特性Java12的新特性Java13的新特性Java14的新特性Java15的新特性Java16的新特性Java17的新特性Java...

codecraft28阅读 15.5k评论 3

Java5的新特性
Java语言特性系列Java5的新特性Java6的新特性Java7的新特性Java8的新特性Java9的新特性Java10的新特性Java11的新特性Java12的新特性Java13的新特性Java14的新特性Java15的新特性Java16的新特性Java17的新特性Java...

codecraft13阅读 20.5k

Java9的新特性
Java语言特性系列Java5的新特性Java6的新特性Java7的新特性Java8的新特性Java9的新特性Java10的新特性Java11的新特性Java12的新特性Java13的新特性Java14的新特性Java15的新特性Java16的新特性Java17的新特性Java...

codecraft20阅读 14.6k

你的code是面向面试编程的,收集和整理leetcode discussion里个人认为的最优且最符合我个人思维逻辑的解...

12 声望
4 粉丝
宣传栏