F.巴啦啦能量 【尺取法】

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章