NC18386. 字符串
描述
输入描述
一行一个字符串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;}