自学内容网 自学内容网

leetcode 3258.统计满足k约束的子字符串

思路一:首先直接三重循环暴力,用substring解决子字符串的截取问题。

class Solution {
    public int countKConstraintSubstrings(String s, int k) {
        if(s.length()<=0)
        return 0;
        int n=s.length();
        int res=0;
        for(int i=0;i<n;i++){
            for(int j=0;j<=i;j++){
                int cnt1=0;
                int cnt0=0;
                String buf=s.substring(j,i+1);
                for(int k1=0;k1<buf.length();k1++){
                    if(buf.charAt(k1)=='1')
                    cnt1++;
                    else
                    cnt0++;
                }
                if(cnt0<=k||cnt1<=k){
                    res++;
                }
            }
        }
        return res;
    }
}

思路二:滑动窗口,一般面对子字符串问题,我们应该想到双指针,前缀和,以及滑动窗口这样一系列的技巧。

滑动窗口稍微复习一下,可变滑动窗口,窗口里面的连续子字符串都是满足题意的,所以在计数子字符串数量的时候,需要额外注意一下。

还有,左指针通常是不会变的,除非窗口内的东西是不满足题意的,一般都是右指针动。然后在指针动的同时,我们一遍计数,一遍判断即可。

class Solution {
    public int countKConstraintSubstrings(String s, int k) {
        int n=s.length();
        if(n==1)
        return 1;
        int res=0;
        int l=0;
        int cnt[]=new int[2];
        for(int r=0;r<n;r++){
            cnt[s.charAt(r)-'0']++;
            while(cnt[1]>k&&cnt[0]>k){
                cnt[s.charAt(l++)-'0']--;
            }
            res+=r-l+1;
        }
        return res;
    }
}


原文地址:https://blog.csdn.net/m0_73917165/article/details/143705183

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!