列表

详情


NC18386. 字符串

描述

小N现在有一个字符串S。他把这这个字符串的所有子串都挑了出来。一个S的子串T是合法的,当且仅当T中包含了所有的小写字母。小N希望知道所有的合法的S的子串中,长度最短是多少。

输入描述

一行一个字符串S。只包含小写字母。S的长度不超过106.

输出描述

一行一个数字,代表最短长度。数据保证存在一个合法的S的子串。

示例1

输入:

ykjygvedtysvyymzfizzwkjamefxjnrnphqwnfhrnbhwjhqcgqnplodeestu

输出:

49

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

pypy3 解法, 执行用时: 243ms, 内存消耗: 33208K, 提交时间: 2023-02-13 19:27:50

s = input()
j = 0
l = 0
mins = len(s)
d = {}
for i in range(len(s)):
    if s[i] not in d:
        d[s[i]] = 1
        l += 1
    else:
        d[s[i]] += 1
    if l >= 26:
        while d[s[j]] > 1:
            d[s[j]] -= 1
            j += 1
            mins = min(mins, i - j + 1)
print(mins)

Python3 解法, 执行用时: 1198ms, 内存消耗: 6660K, 提交时间: 2022-07-23 11:12:52

s = input()
l, r = 0, 0
win = {}
res = 1e6
while r < len(s):
    c = s[r]
    win[c] = win.get(c, 0) + 1
    r += 1
    while len(win) == 26:
        res = min(res, r-l)
        ch = s[l]
        l += 1
        win[ch] -= 1
        if win[ch] == 0:
            win.pop(ch)
print(res)

C++14(g++5.4) 解法, 执行用时: 57ms, 内存消耗: 1392K, 提交时间: 2020-04-12 17:10:14

#include<iostream>
using namespace std;char s[1000001];int cnt[26],i=0,j=0,num=0,ans=1e9;int main(){cin>>s;while(s[j]){if(cnt[s[j]-'a']==0) ++num;++cnt[s[j]-'a'];while(cnt[s[i]-'a']>1){--cnt[s[i]-'a'];++i;}if(num==26&&j-i+1<ans) ans=j-i+1;++j;}cout<<ans;}

C++11(clang++ 3.9) 解法, 执行用时: 74ms, 内存消耗: 2432K, 提交时间: 2018-08-31 20:33:59

#include<iostream>
using namespace std;string s;int x[200];int c(){for(int i=97;i<123;i++)if(!x[i])return 0;return 1;}int main(){cin>>s;int p=s.size(),a=1e9,l=0,r=0;while(l<p-25&&r<p){while(!c()&&r<p)x[s[++r]]++;a=min(a,r-l+1);x[s[l++]]--;}cout<<a;}

上一题