最小子串覆盖

给定一个字符串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);
}
}
};

最新文章

  1. webpack的简单使用
  2. 【学】React的学习之旅3 - 添加事件(onClick)
  3. XML转换为对象操作类详解
  4. sql 中实现打乱数据的排序
  5. 三层与MVC
  6. java 使用线程做一个简单的ATM存取款实例.(转)
  7. 与众不同 windows phone (29) - Communication(通信)之与 OData 服务通信
  8. 深度理解 Virtual DOM
  9. 一篇文章读懂Java类加载器
  10. 转:【Java并发编程】之一:可重入内置锁
  11. 沉淀,再出发——安装windows10和ubuntu kylin15.04双系统心得体会
  12. Java笔试题库之选题题篇【1-70题】
  13. Centos7下安装配置elasticsearch 6.3.1
  14. 2018-2019-1 20189206 《Linux内核原理与分析》第九周作业
  15. [转]centos7 移动mysql5.7.19 数据存储位置
  16. 7、Class文件的格式
  17. Unable to create new web application
  18. Activity与Service数据交互:Binder、bindService的用法
  19. 11-st跳舞消耗体力最少
  20. 电脑需要重启才能连上WLAN

热门文章

  1. TinyMCE插件:Filemanager [4.x-6.x] 图片自动添加水印
  2. Go Web 问题集-持续更新
  3. python 字符串拼接效率打脸帖
  4. 北京Uber优步司机奖励政策(2月29日)
  5. 机器学习实战:决策树的存储读写文件报错(Python3)
  6. jquery实现倒计时功能
  7. DMA是什么意思
  8. Unity2017 经典游戏开发教程 算法分析与实现 (张帆 著)
  9. Java基础知识总结一
  10. 「日常训练」Regular Bridge(Codeforces Round 306 Div.2 D)