这题和LC76 Minimum Window Substring可以归为一类,就是给出要找的字符(字符串)和相应个数,利用滑动窗口在另一个字符串上找。类似的题目还有LC3。

首先需要用map把出现的单词和相应出现的次数记录下来。

然后维护一个窗口,一步步往前移动。每移动一次就检查是否满足条件。解题时注意每个单词的长度是固定的,这一点给解题带来很大方便。

 1 class Solution{
 2 public:
 3 vector<int> findSubstring(string S, vector<string> &L) {
 4         map<string,int> words;
 5         map<string,int> cur;
 6         int wordNum = L.size();
 7         for(int i = 0; i < wordNum; i++)
 8             words[L[i]]++;
 9         int wordLen = L[0].size();
10         vector<int> res;
11         for(int i = 0; i <= (int)S.size()-wordLen*wordNum; i++)
12         {
13             cur.clear();
14             int j;
15             for(j = 0; j < wordNum; j++)
16             {
17                 string word = S.substr(i+j*wordLen, wordLen);
18                 if(words.find(word) == words.end())
19                     break;
20                 cur[word]++;
21                 if(cur[word]>words[word])
22                     break;
23             }
24             if(j == wordNum)
25                 res.push_back(i);
26         }
27         return res;
28     }
29 };

View Code

以上程序需要维护两个map,其中一个用于循环后复原初始map。这造成了空间上的浪费。此外,移动一次仅仅移动一步,这对效率而言也是损害。

其实,移动可以分为两种,一种是开始坐标的移动,这种移动每次移动1步,但最多只需移动一个单词长度即可。另一种移动则按单词长度来移动。这样维护的窗口能更有效地找到结果,具体思路和LC76 Minimum Window Substring 类似。

小细节需要注意的是,对于map容器,以下代码:

1 if(imap.find("u")==imap.end())
2     imap.insert(make_pair("u",1));
3 else
4     imap["u"]++;

可以直接用一句话(效率更高)代替

imap["u"]++;

如果"u"一开始不存在,imap["u"]会初始化为0。

另外unordered_map比map查询速度要快。

 1 class Solution {
 2 public:
 3     vector<int> findSubstring(string s, vector<string>& words) {
 4         vector<int> result;
 5         if (words.size() == 0) {
 6             return result;
 7         }
 8         unordered_map<string, int> hash;
 9         for (int i = 0; i < words.size(); i++) {
10             hash[words[i]]++;
11         }
12         int wSize = words[0].length();
13         for (int start = 0; start < wSize; start++) {
14             int wCount = 0;
15             unordered_map<string, int> slidingWindow;
16             for (int i = start; i + wSize <= s.length(); i+=wSize) {
17                 string word = s.substr(i, wSize);
18                 if (hash.find(word) == hash.end()) {
19                     slidingWindow.clear();
20                     wCount = 0;
21                 } else {
22                     wCount++;
23                     slidingWindow[word]++;
24                     while (hash[word] < slidingWindow[word]) {
25                         string removedWord = s.substr(i - (wCount-1) * wSize, wSize);
26                         slidingWindow[removedWord]--;
27                         wCount--;
28                     }
29                 }
30                 if (wCount == words.size()) {
31                     result.push_back(i - (wCount - 1) * wSize);
32                 }
33             }
34         }
35         return result;
36     }
37 };

View Code

(用哈希数组记录单词出现次数,别想着以后碰到了单词可以将对应值减1,然后到了一定时候用取巧的方法判断数组是否都为0 。换言之,貌似除了循环,没有什么取巧的函数可以判断一个整型数组是否都为0)

转载于:https://www.cnblogs.com/vaecn/p/5355374.html

LC30 Substring with Concatenation of All Words相关推荐

  1. LeetCode 30. Substring with Concatenation of All Words

    LeetCode 30. Substring with Concatenation of All Words Solution1: 转载自:http://www.cnblogs.com/grandya ...

  2. leetcode 30. Substring with Concatenation of All Words 与所有单词相关联的字串 滑动窗口法

    题目描述 给定一个字符串 s 和一些长度相同的单词 words.在 s 中找出可以恰好串联 words 中所有单词的子串的起始位置. You are given a string, s, and a ...

  3. 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. ...

  4. 【leetcode】30. Substring with Concatenation of All Words

    题目如下: 解题思路:本题题干中有一个非常关键的前提,就是words中的所有word的长度一样,并且都要被使用到.所以,我们可以把输入的s按word的长度进行等分,以s = "barfoot ...

  5. Leetcode:Substring with Concatenation of All Words分析和实现

    题目大意是传入一个字符串s和一个字符串数组words,其中words中的所有字符串均等长.要在s中找所有的索引index,使得以s[index]为起始字符的长为words中字符串总长的s的子串是由wo ...

  6. 030 Substring with Concatenation of All Words 与所有单词相关联的字串

    给定一个字符串 s 和一些长度相同的单词 words,找出 s 与 words 中所有单词(words 每个单词只出现一次)串联一起(words中组成串联串的单词的顺序随意)的字符串匹配的所有起始索引 ...

  7. 30. Substring with Concatenation of All Words

    2019独角兽企业重金招聘Python工程师标准>>> 转载于:https://my.oschina.net/datacube/blog/704394

  8. **LeetCode 30. Substring with Concatenation of All Words

    https://leetcode.com/problems/substring-with-concatenation-of-all-words/ 滑动窗口法.解析看这里: http://www.2ct ...

  9. leetcode解题文件夹

    点击打开链接点击打开链接点击打开链接參考文献:http://blog.csdn.net/lanxu_yy/article/details/17848219 只是本文准备用超链接的方式连接到对应解答页面 ...

最新文章

  1. 记一次mapreduce读取不到输入文件的问题
  2. dw生日祝福网页制作教程_明星祝福生日视频制作
  3. android画一个圆形图片组件
  4. 编写一个简单的assert宏
  5. java图像处理,彩色图像转灰度图的几种实现方式
  6. 201671010144 2016-2017 《java程序设计》--对象与类!
  7. Arch Linux下打不开gnome-shell
  8. 再获绿色等级5A称号!揭开腾讯数据中心节能环保黑科技
  9. apache/nginx中equest.getServerName()外网环境获取不到代理地址/域名
  10. linux7改网卡名eth,CentOS7修改网卡名ensXX称为eth0
  11. 六元均匀直线阵的各元间距为_梦得杯—镀覆技术论文大赛丨微机电系统器件电镀镍厚度均匀性的模拟与改进【刘瑞 许文杰 袁妍妍】...
  12. 【项目分析】利用C#改写JAVA中的Base64.DecodeBase64以及Inflater解码
  13. arpspoof渗透工具使用方法详解+实战
  14. 契税申报期限_纳税申报的5个小常识,会计不知道,真不适合干会计 D1
  15. unity下载与安装
  16. 深度解读,北斗与综合PNT体系
  17. android pin码 经典蓝牙_请问 蓝牙 的自动设置PIN码 功能该怎么实现。
  18. 分享-IE游览器升级工具
  19. JAVA 订单号生成类
  20. 30行代码统计自己 CSDN 博客相关数据

热门文章

  1. 惊叹!中科院学霸和本硕博985在读博士的AI进阶之路
  2. HTML5七夕情人节表白网页(烂漫的空中散落的花瓣3D相册) HTML+CSS+JS 求婚 html生日快乐祝福代码网页 520情人节告白代码 程序员表白源码 3D旋转相册 js烟花代码
  3. 计算某年某月某日是该年中的第几天
  4. 文件补丁管理 - patch
  5. 安卓打开rpm文件_android打开文件及打开方式(打开程序列表) | 学步园
  6. 宋浩 概率统计 笔记_梅花生物的涨跌幅概率统计,及最佳网格策略
  7. 使用PHP的curl爬取百度搜索页相关搜索词
  8. linux的7za无法使用,提示命令找不到:-bash 7za command not found的解决方法.doc
  9. html多媒体效果怎么使用,HTML多媒体标签video、audio、marquee详细讲解
  10. 计算机信息安全论文参考文献,信息安全学论文参考文献 信息安全核心期刊参考文献哪里找...