F.巴啦啦能量
Time Limit: 2500 MS
Memory Limit: 256000 K
Total Submit: 70 (24 users)
Total Accepted: 9 (9 users)
Special Judge: No
Description
话说上回涂山小八进入“时空之门”,却不是回到现实世界,而是一间方正小屋。随着时空之门缓缓关上,小八才看清墙上排着很多奇怪的字符。正奇怪着,小屋内响起了说话声。
“你现在本应已回到现实世界,但你来的时间太久,能量已经用光,无法直接通过时空之门,所以才会来到此地。唯今之计只有获得巴啦啦能量,否则你依然会被永远留在此地。”
“如何获得巴啦啦能量?”
“看见墙上的巴啦啦密文了吗?我现在给你一个能量之匙,从巴啦啦密文中找出巴啦啦能量串即可获得巴啦啦能量。巴啦啦能量串是所有包含能量之匙的最小串,切记,若找到多个符合要求的巴啦啦能量串,不可贪多,只需带走第一个,否则前功尽弃。”
Input
输入数据有多组,每组数据输入第一行输入字符串巴啦啦密文S,第二行输入字符串能量之匙T,S长度lens(1≤lens≤105 ),T长度lent(1≤lent≤105 )(输入不包含空格),输入字符区分大小写。
Output
对于每组输入数据,输出找到的巴啦啦能量串,每组输出占一行。如果找不到巴啦啦能量串,输出一个空行。
Sample Input
ADOBECODEBANC
ABC
ABCDA
BD
Sample Output
BANC
BCD
尺取法 查找某一串在主串中出现 输出存在的最小串
#include <stdio.h>
#include <iostream>
#include <string>
#include <map>
using namespace std;
string minWindow(string S, string T){
map<char, int> m;
for(int i = 0; i < T.size(); ++ i)
++ m[T[i]];
int cnt = 0, l = 0, minl = 0, minsize = S.size() + 1;
for(int r = 0; r < S.size(); ++ r)
if(m.find(S[r]) != m.end()){
if(-- m[S[r]] >= 0) //如果该字符已经存在 就不再进行 字符的相加操作
++ cnt; //如果字符不存在 就进行 一个 模式串中的 字符的减少
while(cnt == T.size()){
if(r - l + 1 < minsize)
minl = l, minsize = r - l + 1;//当前的下标 以及之后的长度
if(m.find(S[l]) != m.end())
if(++ m[S[l]] > 0) //这个特判 在 m【字符】如果该字符 删除当前字符 如果当前字符存在多个 就不进行cnt--;
-- cnt;
++ l;//但是l 要往后面移动
}
}
if(minsize > S.size())
return "";
return S.substr(minl, minsize);// 截取 s主串的 min1位置 往后的 minsize大小的串
}
int main(){
//freopen("data.in", "r", stdin);
//freopen("data.out", "w", stdout);
string s, t;
while(cin >> s >> t){
string ans = minWindow(s, t);
cout << ans << endl;
}
return 0;
}