转载:https://blog.csdn.net/fly_yr/article/details/51134340

题目

最小子串覆盖

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

注意事项

如果在source中没有这样的子串,返回"",如果有多个这样的子串,返回长度最小的子串。

说明

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

——不需要。

样例

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

挑战

要求时间复杂度为O(n)

分析

采用哈希的思想,记录字母出现次数。
大小写字母的ASCII码不大于256,这样array['A']=3指A出现3次,array['B']=1指B出现了一次,以此类推,不能用常规意义上的定义array[0]=3表示A出现3次,这样就多了一层映射!故而数组的长度设置为256即可存放所有的字母。

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

/*
32 最小子串覆盖
给定一个字符串source和一个目标字符串target,在字符串source中找到包括所有目标字符串字母的子串。
如果在source中没有这样的子串,返回"",如果有多个这样的子串,返回长度最小的子串。
说明
在答案的子串中的字母在目标字符串中是否需要具有相同的顺序?
——不需要。
样例
给出source = "ADOBECODEBANC",target = "ABC" 满足要求的解  "BANC"
*/#include <iostream>
#include <cstdlib>
#include <vector>
#include <string>
#include <algorithm>using namespace std;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 hereif (source.empty() || target.empty())return "";int sLen = source.length(), tLen = target.length();vector<int> sHash(256, 0), tHash(256, 0);/*建立源串的映射,存储每个字符的出现次数*/for (int i = 0; i < tLen; ++i){++tHash[target[i]];}//for/*记录符合要求的子串的位置,以及找到的字符个数*/int beg = -1, end = sLen, found = 0, minLen = sLen;for (int i = 0, start = i; i < sLen; ++i){++sHash[source[i]];/*更新当前找到的字符个数*/if (sHash[source[i]] <= tHash[source[i]])++found;/*判断是否找到所有字符*/if (found == tLen){/*将源串开头未出现在目标串的字符跳过*/while (start < i && sHash[source[start]] > tHash[source[start]]){--sHash[source[start]];++start;}//while/*找到符合要求子串的首尾位置start 与 i*/if (i - start < minLen){minLen = i - start;beg = start;end = i;}//if/*跳过该子串的开头位置,寻找下一个子串*/--sHash[source[start++]];--found;}//if}//for/*如果beg值为-1,说明不存在这样的子串*/if (beg == -1)return "";elsereturn source.substr(beg, end - beg + 1);}
};int main()
{Solution s;string source = "ADOBECODEBANC", target = "BANC";cout << s.minWindow(source, target) << endl;system("pause");return 0;
}

Minimum Window Substring 最小覆盖子串算法相关推荐

  1. 【打印代码+好好理解+子串问题】LeetCode 76. Minimum Window Substring

    LeetCode 76. Minimum Window Substring 字符串子串问题!!!理解这题真是花了很大的功夫!!! 参考链接:https://blog.csdn.net/weixin_4 ...

  2. LeetCode 76. Minimum Window Substring / 567. Permutation in String

    76. Minimum Window Substring 典型Sliding Window的问题,维护一个区间,当区间满足要求则进行比较选择较小的字串,重新修改start位置. 思路虽然不难,但是如何 ...

  3. Minimum Window Substring @LeetCode

    不好做的一道题,发现String Algorithm可以出很多很难的题,特别是多指针,DP,数学推导的题.参考了许多资料: http://leetcode.com/2010/11/finding-mi ...

  4. 72.Minimum Window Substring(最小子串窗口)

    Level:   Hard 题目描述: Given a string S and a string T, find the minimum window in S which will contain ...

  5. LeetCode 笔记系列16.3 Minimum Window Substring [从O(N*M), O(NlogM)到O(N),人生就是一场不停的战斗]...

    题目:Given a string S and a string T, find the minimum window in S which will contain all the characte ...

  6. LeetCode - Minimum Window Substring

    题目: Given a string S and a string T, find the minimum window in S which will contain all the charact ...

  7. LeetCode 笔记系列16.1 Minimum Window Substring [从O(N*M), O(NlogM)到O(N),人生就是一场不停的战斗]...

    题目: Given a string S and a string T, find the minimum window in S which will contain all the charact ...

  8. LeetCode 笔记系列16.2 Minimum Window Substring [从O(N*M), O(NlogM)到O(N),人生就是一场不停的战斗]...

    题目:Given a string S and a string T, find the minimum window in S which will contain all the characte ...

  9. [LeetCode] Minimum Window Substring 散列映射问题

    题目: Given a string S and a string T, find the minimum window in S which will contain all the charact ...

最新文章

  1. #define WIN32_LEAN_AND_MEAN 的作用
  2. 前端学习(1501):一次帮别人解决问题的案例
  3. 21 CO配置-控制-产品成本控制-成本对象控制-检查制造订单 (PP) 的成本核算变式
  4. 谷歌硬盘 idm_为什么Google搜索结果比本地硬盘查询要快?
  5. 网络安全CTF竞赛模式、题目类别、所用工具小结
  6. android 可逆加密,AndroidMD5加密算法(可逆)
  7. safari支持java_safari上如何正确启用java插件
  8. 小米为何要死磕某国产手机企业?这是多年被压迫下的反击
  9. 安装了vmWare15,打开虚拟机时,电脑总是重启,怎么办?
  10. windows系统IIS服务安装
  11. 字符串之重复字符统计
  12. 什么时ACL,即ACL原理
  13. 关于蓝牙打印机的一些问题
  14. [转]俞敏洪:我和马云就差了8个字... [来自: news.mbalib.com]
  15. [小记] 微信小程序 - 人脸识别前端(一)初体验
  16. git fork 远端仓库协作开发
  17. mysql 学习记录 全文本搜索
  18. 考驾照选择 AI 教练,心态稳定不会骂人
  19. 劝学篇翻译软件测试,古今贤文劝学篇翻译
  20. 云承软件和云溪哪个好_「云承软件」广州市云承信息科技有限公司怎么样? - 职友集...

热门文章

  1. Java 8 到 Java 14,改变了哪些你写代码的方式?
  2. 看完这篇Redis缓存三大问题,够你和面试官battle几回合了
  3. FastJson稍微使用不当就会导致StackOverflow
  4. Windows平台下SVN安装配置及使用
  5. Activiti 学习记录1 inclusiveGateway与 exclusiveGateway的区别
  6. jeecg公开课今晚主题:新版本功能介绍、online原理和代码生成器,欢迎大家报名
  7. JavaScript捕获窗口关闭事件
  8. ADB wifi调试步骤
  9. 神经网络不学习的原因
  10. 再问数据中台 - 数据中台和业务中台服务有什么区别 应该如何去界定和划分?