lintcode-32-最小子串覆盖
最小子串覆盖
给定一个字符串source和一个目标字符串target,在字符串source中找到包括所有目标字符串字母的子串。
注意事项
如果在source中没有这样的子串,返回"",如果有多个这样的子串,返回起始位置最小的子串。
说明
在答案的子串中的字母在目标字符串中是否需要具有相同的顺序?
——不需要。样例
给出source = "ADOBECODEBANC",target = "ABC" 满足要求的解 "BANC"
挑战
要求时间复杂度为O(n)
标签
领英 哈希表 脸书
思路
采用哈希映射记录字符串中每个字母出现的次数,字符ASCII码有128个,所以用大小为128位的数组记录字符串中每个字母出现的次数,如countSource['A']表示A出现的次数,而不是用countSource[0]表示。
先用countTarget数组记录target中每个字符出现的次数,用begin,end记录最小子串覆盖(MVS)在source中的起始位置和结束位置,之后遍历source。
code
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
int sizeSource = source.size(), sizeTarget = target.size();
if(sizeSource == 0) {
return string("");
}
int i, countSource[128], countTarget[128];
for(i=0; i<128; i++) {
countSource[i] = 0;
countTarget[i] = 0;
}
for(i=0; i<sizeTarget; i++) {
countTarget[target[i]]++;
}
int begin = -1, end = sizeSource, start = 0, found = 0, minLen = sizeSource;
for(i=0,start=i; i<sizeSource; i++) {
countSource[source[i]]++;
if (countSource[source[i]] <= countTarget[source[i]]) {
found++;
}
if (found == sizeTarget) {
while (start < i && countSource[source[start]] > countTarget[source[start]]) {
countSource[source[start]]--;
start++;
}
if (i - start < minLen) {
minLen = i - start;
begin = start;
end = i;
}
countSource[source[start++]]--;
found--;
}
}
if (begin == -1) {
return string("");
}
else {
return source.substr(begin, end - begin + 1);
}
}
};
lintcode-32-最小子串覆盖的更多相关文章
- lintcode 中等题:minimum window substring 最小子串覆盖
题目 最小子串覆盖 给定一个字符串source和一个目标字符串target,在字符串source中找到包括所有目标字符串字母的子串. 样例 给出source = "ADOBECODEBANC ...
- Lintcode--004(最小子串覆盖)
给定一个字符串source和一个目标字符串target,在字符串source中找到包括所有目标字符串字母的子串. 注意事项 如果在source中没有这样的子串,返回"",如果有多个 ...
- 最小子串覆盖 · Minimum Window Substring
[抄题]: 给定一个字符串source和一个目标字符串target,在字符串source中找到包括所有目标字符串字母的子串. 在答案的子串中的字母在目标字符串中是否需要具有相同的顺序? ——不需要. ...
- HDU 4160 Dolls (最小路径覆盖=顶点数-最大匹配数)
Dolls Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...
- 【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 ...
随机推荐
- operator.itemgetter() 字典列表排序
## 字典列表排序 students = [ {"name": "Stanley", "age": 22, "score" ...
- jz2440_lcd
VDEN 使能信号 HSYNC 水平方向的同步信号 VSYNC 垂直方向的同步信号 LED-/LED+ 背光信号 VCLK 时钟信号 VD0~VD23 数字 ...
- java并发(1)
hashmap效率高单线程不安全,hashTable效率低但线程安全 因为hashTable使用synchronized来保证线程安全,所以效率十分低,比如线程1使用put插入数据时,线程2既不能使用 ...
- PHP array_reduce()函数的应用解析
实例 向用户自定义函数发送数组中的值,并返回一个字符串: <?php function myfunction($v1,$v2) { return $v1 . "-" . $v ...
- 中国大学MOOC-C程序设计(浙大翁恺)—— 时间换算
时间换算(10分) 题目内容: UTC是世界协调时,BJT是北京时间,UTC时间相当于BJT减去8.现在,你的程序要读入一个整数,表示BJT的时和分.整数的个位和十位表示分,百位和千位表示小时.如果小 ...
- 北京Uber优步司机奖励政策(3月15日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- 北京Uber优步司机奖励政策(2月2日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- zabbix经常报警elasticsearch节点TCP连接数过高问题
单服务器最大tcp连接数及调优汇总 单机最大tcp连接数 网络编程 在tcp应用中,server事先在某个固定端口监听,client主动发起连接,经过三路握手后建立tcp连接.那么对单机,其最大并发t ...
- cakephp2.x 一个ajax例子.md
CakePHP中的ajax还是比较简单,但要注意一些细节. app/View/Layouts下新建ajaxtest.ctp <!DOCTYPE html PUBLIC "-//W3C/ ...
- 「国庆训练」Bomb(HDU-5934)
题意 给定\(n\)个炸弹,每个炸弹的坐标与代价与影响范围给定,炸弹会引爆影响范围内其他所有炸弹.求引爆所有炸弹的最小代价. 分析 先做\(n^2\)的循环,然后建图,对\(i\)能引爆\(j\)建边 ...