变相的字符串匹配

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

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. IIS 503 错误

    今天早上乘公交的时候,网站运维群里直接炸了,网站打不开,503错误.然后就各种@我,吓得我手机都要扔了,然后马不停蹄的赶往公司去查看错误. 我首先在IIS上浏览网页,想试图在服务器上显现出详细错误,这 ...

  2. STMP服务器发送邮件,本地可以发送但是服务器一直发送不成功;

    在官网上查看到信息 考虑到部分云服务商封禁了其内网对外 25 端口的访问, xxxxx 端口号: 2525 xxxxx 端口号: 587 然后,我换了一下端口号就行了,浪费了我三个小时时间,贼尴尬:

  3. 软件架构自学笔记----分享“去哪儿 Hadoop 集群 Federation 数据拷贝优化”

    去哪儿 Hadoop 集群 Federation 数据拷贝优化 背景 去哪儿 Hadoop 集群随着去哪儿网的发展一直在优化改进,基本保证了业务数据存储量和计算量爆发式增长下的存储服务质量.然而,随着 ...

  4. java编码终极探秘

    首先要明白,java中string字符串都是unicode码保存的,只不过显示的时候会根据一定的规则,比如GBK或者是UTF-8去对照表中查找进行显示. 之所以会乱码就是因为使用错了编码方式. 数据是 ...

  5. 学习java编程能往哪些方向发展

    当下Java训练非常热,是因为通过学习java能够快速的就业,这对于今年就业压力非常大的大学生来说,无疑是一条就业的捷路,虽然培教育费动辄过万,但还是非常值得的. 可是你可曾想过,学习了java编程后 ...

  6. Centos6.7 编译安装 MySQL教程

    Centos6.7 编译安装 MySQL # 安装依赖包 [root@localhost ~]# yum -y install gcc gcc-c++ autoconf* automake* zlib ...

  7. HDU_1023_Train Problem II_卡特兰数

    Train Problem II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  8. http://blog.csdn.net/pizi0475/article/details/48286579 -------------(Collada 快速入门)

    http://blog.csdn.net/zhouhangjay/article/details/8469085 说明:Collada的文件格式,中文版的很少,在csdn上看到了一个Sleepy的,感 ...

  9. 最快的 Python Web 框架入门

    速度比较 框架 实现基础 每秒请求数 平均时间 Sanic Python 3.5 + uvloop 30,601 3.23ms Wheezy gunicorn + meinheld 20,244 4. ...

  10. 【Linq】标准查询操作符

    A.1 聚合 聚合操作符(见表A-1),所有的结果只有一个值而不是一个序列. Average 和 Sum 针对数值 (任何内置数值类型)序列或使用委托从元素值转换为内置数值类型的元素序列. Min 和 ...