题解 | #字符串#
字符串
https://ac.nowcoder.com/acm/problem/18386
下面是对尺取法相关应用的题解
using namespace std;
int cnt[256];
int main(){
string s;
cin >> s;
int l,r,len = s.length();
l = 0, r = -1;
int sum = 0, ans = len;
while(l < len){
while(r < len - 1&& sum < 26){//第一次判断条件写成(r < len) 程序体内的自增语句用(r ++ )来表示,这样也就是当前次在判断上一字母的记录情况,错点在于最后r = len,而这个位置其实是超出数组范围的。
cnt[s[++ r]] ++ ;
if(cnt[s[r]] == 1) sum ++ ;//这里有一个细节问题导致第一次致错,即右端点最终状态应该是r = len - 1,而不能取到 len 。所以每一次判断都要判断当前该点的记录情况,这样的话到最后状态时r就会在 len - 1这个位置停留下来(而且此时len - 1这个位置的字母也会被记录在cnt数组中)。
}//移动右指针直到符合26个字母条件。
if(sum == 26) ans = min(ans , r - l + 1);//判断每一次符合条件的长度和ans的大小。
//cout << ans << endl;
if(cnt[s[l]] >= 1){
cnt[s[l]] --;
if(cnt[s[l ++ ]] == 0) {
sum -- ;
}
}//移动左指针,并维护左指针所在字母的记录情况。
}
cout << ans << endl ;
return 0;
}