题目链接

【题解】

开个字典树记录下所有的单词。
然后注意题目的已知条件
每个单词的长度都是一样的。
这就说明不会出现某个字符串是另外一个字符串的前缀的情况(除非相同).
所以可以贪心地匹配(遇到什么字符就在字典树里面沿着边从根往下走就好).
假设给的单词的个数为len.(每个单词的长度都是L)
显然从每个位置开始都要匹配len次。而且每次都要匹配L个字符。
然后因为可能会出现一个单词出现多次的情况。
那么你得记录一下之前某个单词用了多少次。

【代码】

  1. class Solution {
  2. public:
  3. int tree[100000][26+5],tot;
  4. int tag[100000];
  5. int used[100000];
  6. vector<int> visits;
  7. vector<int> findSubstring(string s, vector<string>& words) {
  8. vector<int> ans;ans.clear();
  9. if (s=="" || words.empty()) return ans;
  10. memset(tree,0,sizeof tree);
  11. memset(tag,0,sizeof tag);
  12. tot = 1;
  13. int lendic = words.size();
  14. for (int i = 0;i < lendic;i++){
  15. if (i>0 && ((int)words[i].size()!=(int)words[0].size())) return ans;
  16. string ts = words[i];
  17. int len2 = ts.size();
  18. int p = 1;
  19. for (int j = 0;j < len2;j++){
  20. if (tree[p][ts[j]-'a']==0){
  21. tree[p][ts[j]-'a'] = ++tot;
  22. }
  23. p = tree[p][ts[j]-'a'];
  24. }
  25. tag[p]++;
  26. }
  27. int L = words[0].size();
  28. int len = s.size();
  29. for (int i = 0;i < len;i++){
  30. bool ok = true;
  31. visits.clear();
  32. for (int j = 0;j < lendic;j++){//要匹配字典里面的单词个数次
  33. int p = 1;
  34. for (int k = i+j*L;k < i+(j+1)*L;k++){//每次匹配的长度是固定的
  35. if (k>=len){
  36. ok = false;
  37. break;
  38. }
  39. if (tree[p][s[k]-'a']==0){
  40. ok = false;
  41. break;
  42. }
  43. p = tree[p][s[k]-'a'];
  44. }
  45. if (!ok) break;
  46. if (tag[p]==0) { ok=false;break;}//如果字典里没有这个单词就停止
  47. if (used[p]==0) visits.push_back(p);//记录一下哪些位置用到了,之后清0用
  48. used[p]++;
  49. if (used[p]>tag[p]){//如果用的次数超过单词的个数了,则不行。
  50. ok = false;
  51. break;
  52. }
  53. }
  54. for (int x:visits) used[x]=0;
  55. if (ok) ans.push_back(i);
  56. }
  57. return ans;
  58. }
  59. };

【LeetCode 30】串联所有单词的子串的更多相关文章

  1. Java实现 LeetCode 30 串联所有单词的子串

    30. 串联所有单词的子串 给定一个字符串 s 和一些长度相同的单词 words.找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置. 注意子串要与 words 中的单词完全匹配, ...

  2. [LeetCode] 30. 串联所有单词的子串

    题目链接: https://leetcode-cn.com/problems/substring-with-concatenation-of-all-words/ 题目描述: 给定一个字符串 s 和一 ...

  3. Leetcode 30 串联所有单词的子串 滑动窗口+map

    见注释.滑动窗口还是好用. class Solution { public: vector<int> findSubstring(string s, vector<string> ...

  4. [LeetCode] 30. Substring with Concatenation of All Words 串联所有单词的子串

    You are given a string, s, and a list of words, words, that are all of the same length. Find all sta ...

  5. [LeetCode] Substring with Concatenation of All Words 串联所有单词的子串

    You are given a string, s, and a list of words, words, that are all of the same length. Find all sta ...

  6. 【LeetCode-面试算法经典-Java实现】【030-Substring with Concatenation of All Words(串联全部单词的子串)】

    [030-Substring with Concatenation of All Words(串联全部单词的子串)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Yo ...

  7. Leetcode 30.与所有单词相关联的子串

    与所有单词相关联的字串 给定一个字符串 s 和一些长度相同的单词 words.在 s 中找出可以恰好串联 words 中所有单词的子串的起始位置. 注意子串要与 words 中的单词完全匹配,中间不能 ...

  8. [leetcode] 30. 与所有单词相关联的字串(cn第653位做出此题的人~)

    30. 与所有单词相关联的字串 这个题做了大概两个小时左右把...严重怀疑leetcode的judge机器有问题.同样的代码交出来不同的运行时长,能不能A题还得看运气? 大致思路是,给words生成一 ...

  9. Leetcode——30.与所有单词相关联的字串【##】

    @author: ZZQ @software: PyCharm @file: leetcode30_findSubstring.py @time: 2018/11/20 19:14 题目要求: 给定一 ...

随机推荐

  1. Java Web学习总结(11)JDBC

    一,简介 JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的 ...

  2. springboot下的多数据源切换

    今天在考虑如果分公司也用系统了,怎么办,是单独的数据库,还是一起使用?所以就想到了切换数据源来实现,但是发现,只是读写分离,还要再改一下,根据用户地域来切换数据源,今天先照着例子做一下. 看了好多文章 ...

  3. 使用juqery-ui完成联想查询功能

    最近公司的项目有个需求,需要使用联想查询功能.就是一个文本输入框,在输入的时候获取值去后端模糊查询然后按照列表显示在下面.效果如下图: 经过搜索找到这个插件,查阅资料可以完成这个功能,即可以实现静态数 ...

  4. servlet3.0 异步处理

    转:https://blog.csdn.net/benjamin_whx/article/details/38874657 13.1.概述 计算机的内存是有限的.Servlet/JSP容器的设计者很清 ...

  5. Linux:主设备号和次设备号

    http://www.linuxidc.com/Linux/2011-03/33863.htm     Linux的设备管理是和文件系统紧密结合的,各种设备都以文件的形式存放在/dev目录下,称为设备 ...

  6. Python 进阶_OOP 面向对象编程_组合与继承

    #目录 前言 组合 派生 通过继承来覆盖重载方法 最常用的重载场景实例方法的重载 从标准类中派生类方法的重载 前言 我们定义一个类是希望能够把类当成模块来使用,并把类嵌入到我们的应用代码中,与其他的数 ...

  7. Intellij Idea乱码解决方案都在这里了

    乱码场景 使用Intellij Idea经常遇到乱码问题,可以总结为以下几类乱码的场景. 1.工程代码乱码. 2.main方法运行,控制台乱码. 3.tomcat运行,控制台乱码. 解决方案 1.工程 ...

  8. luogu P4183 Cow at Large P (暴力吊打点分治)(内有时间复杂度证明)

    题面 贝茜被农民们逼进了一个偏僻的农场.农场可视为一棵有N个结点的树,结点分别编号为 1,2,-,N .每个叶子结点都是出入口.开始时,每个出入口都可以放一个农民(也可以不放).每个时刻,贝茜和农民都 ...

  9. Python之实现迭代器协议

    什么是迭代器: --迭代器(迭代就是循环) 可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator 可迭代对象有: 一类是集合数据类型,如list,tuple,dict,set ...

  10. 关于dom获取元素的几种方式

    原文链接:https://blog.csdn.net/levinhax/article/details/71274456 获取元素DOM对象有很多种方法,以前一直在用getElementById和ge ...