每日算法之二十六:Substring with Concatenation of All Words
变相的字符串匹配
给定一个字符串,然后再给定一组同样长度的单词列表,要求在字符串中查找满足下面条件的起始位置:
1)从这个位置開始包括单词列表中全部的单词。且每一个单词仅且必须出现一次。
2)在出现的过程中不能出现其它的干扰单词。
3)出现的位置可能有多个。
4)单词的出现顺序不做要求。
以下是一个样例:
S:"barfoothefoobarman"
L:"foo","bar"
位置0是出现位置,。两个单词均出现仅出现一次,且没有干扰。
相同位置9也是满足的。
原题要求例如以下:
You are given a string, S,
and a list of words, L,
that are all of the same length. Find all starting indices of substring(s) in S that is a concatenation of each word in L exactly once and without any intervening characters.
思路例如以下:
首先初始化一个map容器,内含单词列表中出现的单词,以及单词出现的次数。
把容器当做比較的模板。
string | int |
bar | 1 |
foo | 1 |
其次,指针i从0指向可能的最后位置。上例中是12,由于单词列表中总长度是6,在S中留下足够6的长度位置就可以。
由于中间干扰词的长度是不确定的。因此i仅仅能是逐一的后移来寻找匹配的位置。
我们首先获得字符串中的第一个单词,bar。查看在上述的容器中是否有这个单词,假设没有,直接指针后移匹配下一个位置開始的单词。查找后是有的,因此我们把这个单词增加到一个新的map容器中,这个容器存储的是从当前指针位置開始满足单词列表的单词。这这个样例中就是bar在初始化的容器中存在,那么就把他增加新容器中。同一时候。统计次数也要递增,接下来查看这个单词在新容器中出现的次数是否小于等于初始化容器中的次数。假设大于说明这是错误的。也须要指针后移。
最后,当我们后移单词列表中指定个数的单词或者由于不匹配而终止从指针位置i開始的查找时。在循环外面我们要推断一下单词匹配的个数是否和单词列表中的次数一样,假设一样说明从当前指针的位置是匹配的。那么就把这个指针位置保存起来。如此循环往复就可以。代码例如以下。顺着走一遍就明确了。
class Solution {
public:
vector<int> findSubstring(string S, vector<string> &L) {
map<string,int> words,cur;
int wordNum = L.size();
int wordLen = L[0].size();
vector<int> res;
for(int k = 0;k<wordNum;k++)
words[L[k]]++;//初始化容器
for(int i = 0;i<=static_cast<int>(S.length()-wordLen*wordNum);i++)
{
cur.clear();//每次使用之前要清空,这个容器是不断变化的
int j;
for(j = 0;j<wordNum;j++)
{
string word = S.substr(i+j*wordLen,wordLen);//获取这个单词
if(words.find(word) == words.end())//这个单词不是单词列表中的
break;
cur[word]++;
if(words[word]<cur[word])//出现的次数多了
break; }
if(j == wordNum)//这时候是匹配的
res.push_back(i);
}
return res;
}
};
每日算法之二十六:Substring with Concatenation of All Words的更多相关文章
- JAVA常见算法题(二十六)
package com.xiaowu.demo; import java.util.Scanner; /** * Java实现将阿拉伯数字转为汉字 * * @author WQ * */ public ...
- 模板方法模式 Template method 行为型 设计模式(二十六)
模板方法模式 Template method 上图为网上百度的一份简历模板截图 相信大家都有求职的经历,那么必然需要简历,写简历的时候,很可能你会网上检索一份简历模板,使用此模板的格式,然后替换为 ...
- 剑指Offer(二十六):二叉搜索树与双向链表
剑指Offer(二十六):二叉搜索树与双向链表 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/ ...
- 深度学习(二十六)Network In Network学习笔记
深度学习(二十六)Network In Network学习笔记 Network In Network学习笔记 原文地址:http://blog.csdn.net/hjimce/article/deta ...
- Bootstrap <基础二十六>进度条
Bootstrap 进度条.在本教程中,你将看到如何使用 Bootstrap 创建加载.重定向或动作状态的进度条. Bootstrap 进度条使用 CSS3 过渡和动画来获得该效果.Internet ...
- Web 前端开发人员和设计师必读精华文章【系列二十六】
<Web 前端开发精华文章推荐>2014年第5期(总第26期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...
- 二十六:Struts2 和 spring整合
二十六:Struts2 和 spring整合 将项目名称为day29_02_struts2Spring下的scr目录下的Struts.xml文件拷贝到新项目的scr目录下 在新项目的WebRoot-- ...
- 二十六、Jcreator使用初步
摘自http://blog.csdn.net/liujun13579/article/details/7751464 二十六.Jcreator使用初步 Jcreator是一个小巧灵活的Java开发工具 ...
- WCF技术剖析之二十六:如何导出WCF服务的元数据(Metadata)[扩展篇]
原文:WCF技术剖析之二十六:如何导出WCF服务的元数据(Metadata)[扩展篇] 通过<实现篇>对WSDL元素和终结点三要素的之间的匹配关系的介绍,我们知道了WSDL的Binding ...
随机推荐
- 实现div毛玻璃背景
毛玻璃效果 ios里毛玻璃效果的使用非常多,本文介绍一个实现div毛玻璃背景的方法 CSS3 Filter CSS3的Filter主要用在图像的特效处理上,默认值为none,还有以下备选项: 1. ...
- python--11、协程
协程,又称微线程,纤程.英文名Coroutine. 子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B,B在执行过程中又调用了C,C执行完毕返回,B执行完毕返回,最后是A执行完毕. 所以子程 ...
- python--9、进程及并发知识
进程 一个文件的正在执行.运行过程就成为一个进程.执行多个程序,把程序文件都加载到内存,并且多个程序的内存空间隔离--空间上的复用. 遇到IO等待,切CPU到别的程序,提升效率.没有IO,一个程序占用 ...
- Android基础TOP4:Tost的使用
Activity: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xm ...
- 4星|《超级技术:改变未来社会和商业的技术趋势》:AI对人友好吗
超级技术:改变未来社会和商业的技术趋势 多位专家或经济学人编辑关于未来的预测,梅琳达·盖茨写了其中一章.在同类书中属于水平比较高的,专家只写自己熟悉的领域,分析与预测有理有据而不仅仅是畅想性质. 以下 ...
- 从CSDN转到cnblogs了
之前一直用的CSDN的博客,网站卡慢经常出问题,发布文章要审核,连修改几个标点符号也要审核,这些我都忍了,毕竟之前发的文章舍不得弃掉. 现在竟然无故封禁我的博客?请问我写的都是技术文章,有哪点违反规定 ...
- 洛谷——P3833 [SHOI2012]魔法树
P3833 [SHOI2012]魔法树 题目背景 SHOI2012 D2T3 题目描述 Harry Potter 新学了一种魔法:可以让改变树上的果子个数.满心欢喜的他找到了一个巨大的果树,来试验他的 ...
- 【数值计算方法】二分法求根的C++简单实现
给定精确度ξ,用二分法求函数f(x)零点近似值的步骤如下: 1 确定区间[a,b],验证f(a)·f(b)<0,给定精确度ξ. 2 求区间(a,b)的中点c. 3 计算f(c). (1) 若f( ...
- web前端学习总结--HTML
web三要素: 浏览器:向服务器发起请求,下载服务器中的网页(HTML),然后执行HTML显示出内容 服务器:接受浏览器的请求,发送相应的页面到浏览器 HTTP协议:浏览器与服务器的通讯协议. HTM ...
- Python - 模块(一)
目录 Python - 模块(一) 模块的引用方式 常用模块 random(随机模块) os模块 sys 序列化模块 hashlib subprocess optparse struct Python ...