给定一个字符串source和一个目标字符串target,在字符串source中找到包括所有目标字符串字母的子串。

注意事项

如果在source中没有这样的子串,返回"",如果有多个这样的子串,返回起始位置最小的子串。

说明

在答案的子串中的字母在目标字符串中是否需要具有相同的顺序?

——不需要。

样例

给出source = "ADOBECODEBANC",target = "ABC" 满足要求的解  "BANC"

标签

 
 

解题:这个题目关于最小子串覆盖,跟字符串匹配还是有区别的,所以不可以用KMP来求解。

思路:

采用哈希的思想,记录字母出现次数。

【方法:可以定义一个整形数组,利用映射 map<char,int> m; 定义一个关联容器也可。】

首先预处理target,用256大小的整数数组t存储里面每个char出现的个数;
然后给定两个指标beg和end,一个移动start,也用一个256长的整数数组s记录从beg到end的这段字符串里面每个char出现的个数。如果
s大于等于t,也就是说s里的每一位大于等于t里相应位置的值,找到当前start位置,为符合要求子串的起点,记录当前beg和end的长度,如果比已经记录最小长度小,那么我们就选这个位最小窗口。记录beg和end。然后让start往前走一位。寻找下一个子串。

代码如下:

class Solution {
public:
/**
* @param source: A string
* @param target: A string
* @return: A string denote the minimum window
* Return "" if there is no such a string
*/
string minWindow(string &source, string &target) {
// write your code here if (source.empty()||target.empty()){
return "";
} int slength=source.length(); //size()和length()都是返回字符串的长度,本质上没有区别;
int tlength=target.length(); int s[],t[];
memset(s,,sizeof(s));
memset(t,,sizeof(t)); for(int i=;i<target.length();i++){ //统计目标串中每个字符出现的次数;
t[target[i]]++;
} int beg = -, end = slength, found = , minLen = slength; //将最小长度先赋值为源字符串的长度; for(int i=,start=;i<source.length();i++){//注意变量start不要拼写错误!
s[source[i]]++;
// 如果加1后这个字符的数量不超过目标串中该字符的数量,则找到了一个匹配字符
if(s[source[i]]<=t[source[i]]){ //比较源串中的字符是否在目标串中出现过;
found++;//更新出现的字符的个数;
} //为了将目标字符串中出现的字符都包含! // 这一点很重要!!!//
// 如果找到的匹配字符数(只是记录匹配的字符数量)等于目标串长度,说明找到了一个符合要求的子串
// 这一点很重要!!!// if(found==tlength){
//将开头没用的都跳过,没用是指该字符出现次数超过了目标串中出现的次数,并把它们出现次数都减1
while(start<i&&s[source[start]]>t[source[start]]){
s[source[start]]--;
start++;
}
//找到符合要求子串的首尾位置start 与 i, 这时候start指向该子串开头的字母,判断该子串长度
if(i-start<minLen){
minLen=i-start;
beg=start;
end=i;
}
s[source[++start]]--;
found--;//跳过无用的字符后,found减1,然后寻找更短的满足要求的字符串;
}
}
/*如果beg值为-1,说明不存在这样的子串*/
if (beg == -)
return "";
else
return source.substr(beg, end - beg + );
}
};
// 理解时,可以写一个字符串来模拟程序执行过程!

题目有一些难度,参考http://blog.csdn.net/fly_yr/article/details/51134340

应熟练此类题目。

Lintcode--004(最小子串覆盖)的更多相关文章

  1. lintcode 中等题:minimum window substring 最小子串覆盖

    题目 最小子串覆盖 给定一个字符串source和一个目标字符串target,在字符串source中找到包括所有目标字符串字母的子串. 样例 给出source = "ADOBECODEBANC ...

  2. 最小子串覆盖 · Minimum Window Substring

    [抄题]: 给定一个字符串source和一个目标字符串target,在字符串source中找到包括所有目标字符串字母的子串. 在答案的子串中的字母在目标字符串中是否需要具有相同的顺序? ——不需要. ...

  3. lintcode-32-最小子串覆盖

    最小子串覆盖 给定一个字符串source和一个目标字符串target,在字符串source中找到包括所有目标字符串字母的子串. 注意事项 如果在source中没有这样的子串,返回"" ...

  4. 【HDU1960】Taxi Cab Scheme(最小路径覆盖)

    Taxi Cab Scheme Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  5. loj 1429(可相交的最小路径覆盖)

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1429 思路:这道题还是比较麻烦的,对于求有向图的可相交的最小路径覆盖,首先要解决成环问 ...

  6. 【HDU3861 强连通分量缩点+二分图最小路径覆盖】

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3861 题目大意:一个有向图,让你按规则划分区域,要求划分的区域数最少. 规则如下:1.有边u到v以及有 ...

  7. POJ 3216 最小路径覆盖+floyd

    Repairing Company Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 6646   Accepted: 178 ...

  8. POJ3020Antenna Placement(最小路径覆盖+重在构图)

    Antenna Placement Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7788   Accepted: 3880 ...

  9. POJ 3020 (二分图+最小路径覆盖)

    题目链接:http://poj.org/problem?id=3020 题目大意:读入一张地图.其中地图中圈圈代表可以布置卫星的空地.*号代表要覆盖的建筑物.一个卫星的覆盖范围是其周围上下左右四个点. ...

随机推荐

  1. nfs:server 172.168.1.22 not responding,still trying问题解决方法 平台为RealARM 210平台

    nfs:server 172.168.1.22 not responding,still trying问题解决方法 ,平台为RealARM 210平台. 这里的问题是在使用nfs挂载文件系统时遇到的, ...

  2. COJ 0995 WZJ的数据结构(负五)区间操作

    WZJ的数据结构(负五) 难度级别:C: 运行时间限制:1000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 请你设计一个数据结构,完成以下功能: 给定一个大小为 ...

  3. COJ 0557 4013多重部分和问题

    4013多重部分和问题 难度级别:B: 运行时间限制:2000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 n种大小不同的数字 Ai,每种各Mi个,判断是否可以从 ...

  4. Android圆角矩形的实现

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:Android=&quo ...

  5. 《SDN核心技术剖析和实战指南》2.2OpenFlow交换机规范小结

    这节的内容相当多,主要是介绍OpenFlow标准特别是流表的相关特性. 典型的OpenFlow标准由三部分组成:安全通道,流表和OpenFlow协议.注意这个标准是一份设备标准,并不单指OpenFlo ...

  6. Eclipse默认配色的恢复方法

    Eclipse默认配色的恢复方法 很多搞开发的同学一开始不喜欢默认的eclipse白底配色,去网上千辛万苦搜到了很多黑底暗色的各种eclipse配色然后import上了,之后却发现并不适合自己,想找默 ...

  7. iOS获取设备唯一编号,就算删除app从新安装也不变的方法

    第三方开源代码 https://github.com/soffes/SAMKeychain 使用方法 //获取设备信息32 位字符串 -(NSString *)getDeviceString{ NSS ...

  8. Java基础(十)内部类

    1.使用内部类的原因(3点) ①内部类方法可以访问该内部类定义所在的作用域中的数据,包括私有数据. ②内部类可以对同一个包中的其他类隐藏起来. ③当想要定义一个回调函数且不想编写大量代码时,使用匿名内 ...

  9. MVC VIEW 时间格式控制

    @Convert.ToDateTime(Model.CheckPatronExclusionResults.RequestTime).ToString("yyyy-MM-dd HH:mm:s ...

  10. TO DO NOW——送给奋斗着的程序“猿”们

    大家在我们的日常生活中是不是经常会遇到学习和工作效率低,不能够按照自己的计划有条不紊地按时.按点儿的完成自己的任务呢?是不是还在为此而头疼不堪呢?好吧, 那是你执行力有问题.那么究竟什么是执行力?怎样 ...