变相的字符串匹配

给定一个字符串,然后再给定一组同样长度的单词列表,要求在字符串中查找满足下面条件的起始位置:

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的更多相关文章

  1. JAVA常见算法题(二十六)

    package com.xiaowu.demo; import java.util.Scanner; /** * Java实现将阿拉伯数字转为汉字 * * @author WQ * */ public ...

  2. 模板方法模式 Template method 行为型 设计模式(二十六)

    模板方法模式 Template method 上图为网上百度的一份简历模板截图   相信大家都有求职的经历,那么必然需要简历,写简历的时候,很可能你会网上检索一份简历模板,使用此模板的格式,然后替换为 ...

  3. 剑指Offer(二十六):二叉搜索树与双向链表

    剑指Offer(二十六):二叉搜索树与双向链表 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/ ...

  4. 深度学习(二十六)Network In Network学习笔记

    深度学习(二十六)Network In Network学习笔记 Network In Network学习笔记 原文地址:http://blog.csdn.net/hjimce/article/deta ...

  5. Bootstrap <基础二十六>进度条

    Bootstrap 进度条.在本教程中,你将看到如何使用 Bootstrap 创建加载.重定向或动作状态的进度条. Bootstrap 进度条使用 CSS3 过渡和动画来获得该效果.Internet ...

  6. Web 前端开发人员和设计师必读精华文章【系列二十六】

    <Web 前端开发精华文章推荐>2014年第5期(总第26期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...

  7. 二十六:Struts2 和 spring整合

    二十六:Struts2 和 spring整合 将项目名称为day29_02_struts2Spring下的scr目录下的Struts.xml文件拷贝到新项目的scr目录下 在新项目的WebRoot-- ...

  8. 二十六、Jcreator使用初步

    摘自http://blog.csdn.net/liujun13579/article/details/7751464 二十六.Jcreator使用初步 Jcreator是一个小巧灵活的Java开发工具 ...

  9. WCF技术剖析之二十六:如何导出WCF服务的元数据(Metadata)[扩展篇]

    原文:WCF技术剖析之二十六:如何导出WCF服务的元数据(Metadata)[扩展篇] 通过<实现篇>对WSDL元素和终结点三要素的之间的匹配关系的介绍,我们知道了WSDL的Binding ...

随机推荐

  1. cordova科大讯飞语音识别

    cordova-plugin-IFlyspeech 科大讯飞的语音听说读写的cordova插件 Supported Platforms iOS android Installation 插件安装命令: ...

  2. SQL基本操作——DROP撤销索引、表以及数据库

    DROP撤销索引.表以及数据库 --DROP INDEX 命令删除表格中的索引 DROP INDEX table_name.index_name --DROP TABLE 语句删除表(表的结构.属性以 ...

  3. 详解HashMap数据结构实现

    HashMap的设计是由数组加链表的符合数据结构,在这里用自己的语言以及结合源码去总结一下,如果有不对的地方希望评论指正,先拱手谢谢. HashMap是日常中非常常用的一种数据结构,我们要想深入了解学 ...

  4. Nrpe 插件安装教程

    Nrpe 插件安装教程  blog地址: http://www.cnblogs.com/caoguo 一.nagios plugins的安装 [root@Nrpe ~]# yum install -y ...

  5. C# Winform 获得下拉框 选中的值

    string PrintName = cmbPrinter.SelectedIndex.ToString(); PrintName = cmbPrinter.SelectedItem.ToString ...

  6. Python 之lxml解析库

    一.XPath常用规则 二.解析html文件 from lxml import etree # 读取HTML文件进行解析 def parse_html_file(): html = etree.par ...

  7. JS获取图片的原始宽度和高度

    页面中的img元素,想要获取它的原始尺寸,以宽度为例,可能首先想到的是元素的innerWidth属性,或者jQuery中的width()方法.如下: <img id="img" ...

  8. table案例一

    实现效果: html <style> #mform{ margin: 10px; } #mtable{ border-collapse: collapse; } #mtable thead ...

  9. 00 python基础知识

    ''' ''' print('hello world!') ''' 变量 ''' # 变量的:‘tank’,会在内存中产生一份内存地址 #变量名:相当于一个门牌号,用于与变量进行绑定 # = :用来把 ...

  10. 怎么选择最适合自己的Linux培训机构?

    Linux培训已经成为入门Linux的一个重要途径,它的优势在于学习知识的系统性.快速性和实用性.Linux培训毕业的学员大多数拥有较强的实战动手能力,能够较快上手,更符合企业需求. 不过,大部分同学 ...