变相的字符串匹配

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

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. 函数 out 传值 分割

    public void Jia(int a ,int b) { a = a + b; Console.WriteLine(a); } public void Jia1(int a,out int b) ...

  2. [转]Linux下/proc目录简介

    1. /proc目录Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构.改变内核设置的机制.proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间.它以文 ...

  3. Javascript实现导航锚点滚动效果实例

    本篇文章主要介绍了Javascript实现页面滚动时导航智能定位,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 常见的开发页面中可能会有这么一个需求,页面中会有多个模块,每个模块对应一个导航,当页 ...

  4. Angular——tab切换案例

    基本介绍 angular框架下的tab切换,相比较于之前的纯js写的代码,有一个很大的特点就是以数据为驱动,基本上不用搜索dom元素就可以实现效果 基本使用 (1)导航部分使用的是的状态使用的是ng- ...

  5. PHP 之ip查询接口

    /** * @param $ip 待查询的ip * @return mixed */ function getIpAddressInfo($ip) { $ipurl = 'http://api.ip1 ...

  6. VS2015编译ffmpeg的问题解决

    刚装了vs2015,打开一些ffmpeg项目,发现不能编译通过,包括stdio.h都无法找到,可能是vs2015的bug吧. 现在记录一下解决方法: 我的目录是这样定义的: C:\Program Fi ...

  7. 发现是在IE6-IE9下,下列元素table,thead,tfoot,tbody,tr,col,colgroup,html,title,style,frameset的innerHTML属性是只读的

     table ID="zhutiTable" html2="<tr></tr>": 的数据 setTableInnerHTML(docu ...

  8. [备忘]git常用命令

    网站有点儿久没有维护(因为去做其他事情了呗),现在空下来,回来改了网站的一些东西,却忘记了git的一些常用的命令,于是便写下这篇文,方便查阅,免得每次都去看手册(毕竟我懒啊!!) 检查当前文件状态:g ...

  9. Java Web项目实战第1篇之环境搭建

    写在前面的话 从今天开始一个Java Web实战项目,参考自 http://blog.csdn.net/eson_15/article/details/51277324 这个博客(非常感谢博主的分享精 ...

  10. JavaScript学习总结(7)——JavaScript基础知识汇总