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;
}