算法设计与编程 完美字符串 题型:双指针

43 阅读1分钟

赛氪OJ-专注于算法竞赛的在线评测系统 (saikr.com)

#include<bits/stdc++.h>
using namespace std;
//13
//there is a quick brown fox jumping over the lazy dog and cat
int main() {
    int n;
    cin >> n;
    string s[100000];
    int a[26] = {0}; // 统计字母a~z出现的个数
    for (int i = 0; i < n; i++) {
        cin >> s[i];
    }
    int num = 0; // 记录当前窗口中不同字母的数量
    int ans = INT_MAX; // 存储最小长度的答案
    int res = 0; // 当前窗口的长度
    int l = 0, r = 0; // 滑动窗口的左右端点

    while (r <= n) { // l一定小于r,设r就行了
        // 不满26个字母就一直右移右端点
        if (num < 26) {
            for (int i = 0; i < s[r].length(); i++) {
                
				a[s[r][i]-97]++;
				
				if (a[s[r][i]-97] == 1) {
                    num++; // 出现了一个新字母就计数一下
                }
            }
            res += s[r].length();
            r++;
        } else { // 当前区间够26个字母了
            ans = min(ans, res); // 更新最小长度
            // 移动左端点
            for (int i = 0; i < s[l].length(); i++) {
            	
            	a[s[l][i]-97]--;
                 if (a[s[l][i]-97] == 0) {
                    num--; // 一个字母已经被删没了
                }
            }
            res -= s[l].length(); // 更新当前窗口的长度
            l++; // 左端点++
        }
    }

    cout << ans << endl; // 输出最小长度的答案
    return 0;
}