题解 | #字符串#

字符串

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;
}
全部评论

相关推荐

1 收藏 评论
分享
牛客网
牛客企业服务