Lintcode--004(最小子串覆盖)
给定一个字符串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(最小子串覆盖)的更多相关文章
- lintcode 中等题:minimum window substring 最小子串覆盖
题目 最小子串覆盖 给定一个字符串source和一个目标字符串target,在字符串source中找到包括所有目标字符串字母的子串. 样例 给出source = "ADOBECODEBANC ...
- 最小子串覆盖 · Minimum Window Substring
[抄题]: 给定一个字符串source和一个目标字符串target,在字符串source中找到包括所有目标字符串字母的子串. 在答案的子串中的字母在目标字符串中是否需要具有相同的顺序? ——不需要. ...
- lintcode-32-最小子串覆盖
最小子串覆盖 给定一个字符串source和一个目标字符串target,在字符串source中找到包括所有目标字符串字母的子串. 注意事项 如果在source中没有这样的子串,返回"" ...
- 【HDU1960】Taxi Cab Scheme(最小路径覆盖)
Taxi Cab Scheme Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- loj 1429(可相交的最小路径覆盖)
题目链接:http://lightoj.com/volume_showproblem.php?problem=1429 思路:这道题还是比较麻烦的,对于求有向图的可相交的最小路径覆盖,首先要解决成环问 ...
- 【HDU3861 强连通分量缩点+二分图最小路径覆盖】
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3861 题目大意:一个有向图,让你按规则划分区域,要求划分的区域数最少. 规则如下:1.有边u到v以及有 ...
- POJ 3216 最小路径覆盖+floyd
Repairing Company Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 6646 Accepted: 178 ...
- POJ3020Antenna Placement(最小路径覆盖+重在构图)
Antenna Placement Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7788 Accepted: 3880 ...
- POJ 3020 (二分图+最小路径覆盖)
题目链接:http://poj.org/problem?id=3020 题目大意:读入一张地图.其中地图中圈圈代表可以布置卫星的空地.*号代表要覆盖的建筑物.一个卫星的覆盖范围是其周围上下左右四个点. ...
随机推荐
- LeetCode _ Word Break
Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separa ...
- html编码转换
http://webdesign.about.com/od/localization/l/blhtmlcodes-math.htm http://www.cnblogs.com/terryglp/ar ...
- 二叉查找树:Python实现
#coding:utf8 #author:HaxtraZ class BST(object): """二叉查找树的简单实现""" def _ ...
- 自写 jQuery 大幅弹窗广告插件(不喜勿拍)
最近写了做的两个项目都要做几乎同一件事,在首页弹出一个广告.本来是想在网上找一个的,找了几个,花了时间但都不怎么满意,尼玛呀,坑爹呀…… 最后一想,干脆自己动手了. 第一次写,在网上找一些例子来看. ...
- 2014-08-01 ASP.NET中对SQLite数据库的操作——ADO.NET
今天是在吾索实习的第18天.我主要学习了如何在ASP.NET中对SQLite数据库的操作,其基本操作如下: 添加引用System.Data.SQLite.dll(PS:在网页里面任意找到适合的.NET ...
- HDOJ(HDU) 1563 Find your present!(异或)
Problem Description In the new year party, everybody will get a "special present".Now it's ...
- openstack neutron debugs listss
Connection to neutron failed: [Errno 111] Connection refused
- zoj3422Go Deeper(2-sat + 二分)
题目请戳这里 题目大意: go(int dep, int n, int m) begin output the value of dep. if dep < m and x[a[dep]] + ...
- JS浏览器对象-Location对象
1.返回web主机的域名 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...
- Linux设备文件自动生成
第一种是使用mknod手工创建:# mknod <devfilename> <devtype> <major> <minor> 第二种是自动创建设备节点 ...