[Lintcode]Word Squares(DFS|字符串)

题意

分析

0.如果直接暴力1000^5会TLE,因此考虑剪枝
1.如果当前需要插入第i个单词,其剪枝如下
1.1 其前缀(0~i-1)已经知道,必定在前缀对应的集合中找
– 第一个词填了ball 后,第二个词必须以a开头
– 第二个词填了area后,第三个词必须以le开头
– 以其他开头的就没必要搜下去了
1.2 第i+1~n-1的单词,必定是以对应位置的0~i-1的前缀+nextWord[k]作为前缀
— 第一个词填了ball
– 第二个词想填area的话
– 字典中必须有以le la开头的单词,否则没有的话就不能填area
1.3 如何实现?
利用hash或Trie

代码

class Solution {
public:
    /*
     * @param words: a set of words without duplicates
     * @return: all word squares
     */
    unordered_map >prefix;
    vectorsquare;//存储字符串
    vector >result;
    vector> wordSquares(vector &words) {
        // write your code here
        if(words.size()==0) return result;
        initPrefix(words);
        dfs(0);
        return result;
    }

    void initPrefix(vector&words)
    {
        for(int i=0;iw=prefix[pre];//取出前缀有的字符串
        for(int i=0;i

转载于:https://www.cnblogs.com/chendl111/p/9127091.html

你可能感兴趣的:([Lintcode]Word Squares(DFS|字符串))