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