题目
一个字符串中含有n个字符,其中有m个不同的字符,n>>m,用最少的时间和空间找到包含所有这m个字符的最短的字串,不考虑特殊字符,只考虑字母数字即可。
例如:
abccbaddac, 返回:cbad
aabcadbbbcca,返回:bcad
思路
[算法系列之二十二]包含T全部元素的最小子窗口
本题目相比连接中所说的稍微简单一些,本题目不用考虑重复字符。
代码
#include <iostream>
#include <climits>
using namespace std;
string MinWindow(string S){
int slen = S.size();
if(slen <= 0){
return "";
}
int minWinStart,minWinEnd;
int minWinLen = INT_MAX;
int m = 0;
int needFind[256] = {0};
for(int i = 0;i < slen;++i){
needFind[S[i]] = 1;
}
for(int i = 0;i < 256;++i){
if(needFind[i] == 1){
++m;
}
}
int hasFound[256] = {0};
int val;
int count = 0;
for(int start = 0,end = 0;end < slen;++end){
val = S[end];
++hasFound[val];
if(hasFound[val] <= 1){
++count;
}
if(count == m){
int startEle = S[start];
while(hasFound[startEle] > 1){
--hasFound[startEle];
++start;
startEle = S[start];
}
int curWinLen = end - start + 1;
if(minWinLen > curWinLen){
minWinLen = curWinLen;
minWinStart = start;
minWinEnd = end;
}
}
}
if(count != m){
return "";
}
return S.substr(minWinStart,minWinEnd - minWinStart + 1);
}
int main() {
string S("aabcadbbbcca");
cout<<MinWindow(S)<<endl;
}
引用:
[算法系列之二十二]包含T全部元素的最小子窗口
相似题目:
[LeetCode]76.Minimum Window Substring
<script type="text/javascript">
$(function () {
$('pre.prettyprint code').each(function () {
var lines = $(this).text().split('\n').length;
var $numbering = $('<ul/>').addClass('pre-numbering').hide();
$(this).addClass('has-numbering').parent().append($numbering);
for (i = 1; i <= lines; i++) {
$numbering.append($('<li/>').text(i));
};
$numbering.fadeIn(1700);
});
});
</script>
分享到:
相关推荐
得出一个字符串中的连续出现次数最多的子串
统计字串在字符串中出现的次数实验报告(内附源代码)
字符串中寻找最大的回文字串.zip 字符串中寻找最大的回文字串.zip 字符串中寻找最大的回文字串.zip 字符串中寻找最大的回文字串.zip字符串中寻找最大的回文字串.zip
字符串中寻找最大的回文字串 字符串中寻找最大的回文字串 字符串中寻找最大的回文字串
输入一个字符串t和一个正整数m,将字符串t中从第m个字符开始的全部字符复制到字符串s中,再输出字符串s。要求用字符指针定义并调用函数strmcpy(s,t,m),它的功能是将字符串t中从第m个字符开始的全部字符复制到字符串...
输入两个字符串, 求它们最长公共字串的长度
在一个字符串s中查找有几个字串subs,结果返回字串的个数。主要用的indexOf()函数。
使用汇编语言实现的两个字符串中 相同处的查找 并显示个数 最多可实现99处相同处的查找并显示
在实际工作中经常遇到截取两个相同字符串之间的字符的oracle问题,以下是相关语句
设计一个算法,在串str中查找字串substr最后一次出现的位置(不能使用STL)。
C++实现字符串匹配函数,匹配中可以包括通配符
查找两个字符串的最大公共子串,用到指针和函数的知识
程序开发者必须掌握的c# 拼接字符串的几种方式,此文对几种方式的性能的进行了总结和比较
大连理工大学数据结构上机题设计一个算法,在串str中查找字串substr最后一次出现的位置设计一个算法,在串str中查找字串substr最后一次出现的位置
自己编写的C++程序,求两个字符串的最长公共字串。例如a="abcrrrerads",b="afdabcssbcrrresswrds",则结果为bcrrre
大贤者福尔最近开始研究字符串的变换问题,他提出了一个变换规则,使得一个字符串经过一 系列变换之后, 生成另一个字符串, 他把这两个字符串称作等价串。具体变换规则为:初始状态下有-个长度为N的字符串A,另有B、C...
从键盘输入若干个字符串(5~15个),每一串的长度不超过20个字符,请将它们做升序排序并在屏幕上显示。编程要求:Enter键结束一个字串的输入,连续两个Enter键结束整个字串的输入。人机对话输入数据,界面友好,容错...
在txt文本中,查找和替换指定的字符串,并另存文件.
对于一个字符串来说,定义一次循环移位操作为:将字符串的第一个字符移动到末尾形成新的字符串。 给定两个字符串s1 和s2 ,要求判定其中一个字符串是否是另一字符串通过若干次循环移位后的新字符串的子串。例如CDAA...
可导入文件,实现内容转换ASCII,转成大写,转成小写,保存,替换,统计的小工具,很实用哦!