题意

分析

0.如果直接暴力1000^5会TLE,因此考虑剪枝

1.如果当前需要插入第i个单词,其剪枝如下

1.1 其前缀(0~i-1)已经知道,必定在前缀对应的集合中找

– 第一个词填了ball 后,第二个词必须以a开头

– 第二个词填了area后,第三个词必须以le开头

– 以其他开头的就没必要搜下去了

1.2 第i+1n-1的单词,必定是以对应位置的0i-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<string,vector<string> >prefix;
vector<string>square;//存储字符串
vector<vector<string> >result;
vector<vector<string>> wordSquares(vector<string> &words) {
// write your code here
if(words.size()==0) return result;
initPrefix(words);
dfs(0);
return result;
} void initPrefix(vector<string>&words)
{
for(int i=0;i<words.size();++i)
{
string str=words[i];
prefix[""].push_back(str);
for(int j=0;j<str.size();++j)//将每个字符串放入对应的前缀
prefix[str.substr(0,j+1)].push_back(str);
}
} void dfs(int len)//当前放的行数
{
if(len==words[0].size())
{
result.push_back(square);
return ;
}
string pre;
//先将所放字符串前缀求出,竖向计算
for(int i=0;i<len;++i)
{
pre+=square[i][len];
}
vector<string>w=prefix[pre];//取出前缀有的字符串
for(int i=0;i<w.size();++i)
{
if(!check(len,w[i])) continue;
}
square.push_back(w[i]);
dfs(len+1);
square.pop_back();
}
/*
check的原则,检查未来插入的字符串是否有相同的前缀
*/
bool check(int len,string nextWord)
{
for(int j=len+1;j<words[0].size();++j)
{
string str;
for(int i=0;i<len;++i) str+=square[i][j];//第j列0~j-1前缀
str+=nextWord[j];//并加上第j列的字符
if(!prefix[str].size()) return false;
}
return true;
}
};

[Lintcode]Word Squares(DFS|字符串)的更多相关文章

  1. [LeetCode] Word Squares 单词平方

    Given a set of words (without duplicates), find all word squares you can build from them. A sequence ...

  2. Word Squares

    Description Given a set of words without duplicates, find all word squares you can build from them. ...

  3. LC 425. Word Squares 【lock,hard】

    Given a set of words (without duplicates), find all word squares you can build from them. A sequence ...

  4. Leetcode: Word Squares && Summary: Another Important Implementation of Trie(Retrieve all the words with a given Prefix)

    Given a set of words (without duplicates), find all word squares you can build from them. A sequence ...

  5. C# 利用占位符替换word中的字符串和添加图片

    利用占位符替换word中的字符串和添加图片   ///<summary>         /// 替换word模板文件内容,包括表格中内容         /// 调用如下:WordStr ...

  6. LintCode 面试题 旋转字符串

    1.题目描述 题目链接:http://www.lintcode.com/zh-cn/problem/rotate-string/ 给定一个字符串和一个偏移量,根据偏移量旋转字符串(从左向右旋转) 2. ...

  7. LintCode笔记 - 8. 旋转字符串

    这一题相对简单,但是代码质量可能不是很好,我分享一下我的做题笔记以及做题过程给各位欣赏,有什么不足望各位大佬指出来 原题目,各位小伙伴也可以试着做一下 . 旋转字符串 中文English 给定一个字符 ...

  8. 【LintCode】判断一个字符串是否包含另一个字符串的所有字符

    问题描述: 比较两个字符串A和B,确定A中是否包含B中所有的字符.字符串A和B中的字符都是 大写字母. 样例 给出 A = "ABCD" B = "ACD",返 ...

  9. [LintCode] Perfect Squares 完全平方数

    Given a positive integer n, find the least number of perfect square numbers (for example, 1, 4, 9, 1 ...

随机推荐

  1. 硬分叉后,BCH的钱包解决方案

    上周BCH进行了硬分叉,分叉成了两条链:BCH和BCHSV,对于分叉后的BCH如何进行交易呢?钱包是否有相关的危险因素? 由于分叉后的两条链没做重放保护,可能导致一条链上发起的交易,在另一条链上做重放 ...

  2. UITableViewCell的多选操作

    版权声明:本文为博主原创文章.未经博主同意不得转载,转载需加上原博客链接. https://blog.csdn.net/panyong4627/article/details/37902207 - ( ...

  3. POJ 3714 Raid 近期对点题解

    版权声明:本文作者靖心,靖空间地址:http://blog.csdn.net/kenden23/.未经本作者同意不得转载. https://blog.csdn.net/kenden23/article ...

  4. ExtJS教程(5)---Ext.data.Model之高级应用

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/jaune161/article/details/37391399 1.Model的数据验证 这里借助 ...

  5. (扫盲)jQuery extend()和jQuery.fn.extend()的区别

    1.认识jQuery extend()和jQuery.fn.extend() jQuery的API手册中,extend方法挂载在jQuery和jQuery.fn两个不同对象上方法,但在jQuery内部 ...

  6. Linux下/usr/bin/python被删除的后果

    可能部分的人使用linux都有直接root登陆的习惯,这有很大的便利性,因为很多的命令不需要使用sudo请求root权限.但是使用root权限,所有的命令都会立即被执行,即使这个命令是对系统有害处的. ...

  7. Gemini.Workflow 双子工作流正式上线(支持.NET Core)

    接触工作流: 最早接触工作流,是在04年左右,那年,我创造了 Aries 框架的前身第一版框架,另一个同事,创造了工作流的第一版框架. 只是那时候,我并未参与工作流的核心设计,仅仅是帮写了个流程设计器 ...

  8. ZOJ - 3930 Dice Notation 【模拟】

    题目链接 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3930 题意 给出一串字符串 如果是 '+' '-' '*' '/ ...

  9. 和菜鸟一起学android4.0.3源码之硬件gps简单移植【转】

    本文转载自:http://blog.csdn.net/mwj19890829/article/details/18751447 关于Android定位方式 android 定位一般有四种方法,这四种方 ...

  10. tensorflow学习官网地址

    摘自: http://wiki.jikexueyuan.com/project/tensorflow-zh/tutorials/overview.html 内容很多,需要花时间看完