尺取法,字符串

图片说明

https://ac.nowcoder.com/acm/problem/18386

import java.io.IOException;
import java.util.*;

public class Main {

    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        int charr[] = new int[26];
        int min = 999898989;
        if(s.length() <= 26){
            System.out.println(26);
        }else{
            int sum = 0,l = 0,r = 0;
            while(l < s.length()- 25 && r < s.length()){
                if(sum < 26) {
                    if (charr[s.charAt(r) - 'a'] == 0) {
                        sum++;
                    }
                    charr[s.charAt(r) - 'a']++;
                    if (sum < 26) {
                        r++;
                    } else {
                        min = Math.min(r - l + 1, min);
                    }
                }
                if(sum >= 26){
                    charr[s.charAt(l) - 'a']--;
                    if(charr[s.charAt(l) - 'a'] == 0){
                        sum--;
                    }
                    if(sum < 26){
                        min = Math.min(r - l + 1,min);
                        r++;
                    }
                    l++;
                }




            }
        System.out.println(min);


        }

    }
}

尺取法顾名思义就是拿尺子一点一点的量取,那么在一串字符串中可以把这一串字符串看成是一个尺子,我们要从尺子里取出最短的并且包含有26个字母的字符串子串。第一次学习尺取法,觉得有点新颖。首先就是用左右两个指针,定好条件(有指针永远小于字符串长度),然后开始循环,用sum记录26个字母出现的次数,如果这个char的数组里的值是0那么就说明没有出现过这个字母,sum++,同时对应字母的值也+1,如果sum的值依然小于26也就是26个字母还没出现完,那么右指针就继续右移,一直移动到sum>=26的时候(注意在这个时候也要对比最小长度),左指针就开始动了,怎么动呢?左指针指到的字母对应的数值就-1,如果等于0,那么就说明这个子串中就不够26个字母了,所以还要让右指针继续右移(但是在过程中刚好等于26,还是要比较最小长度的),一直循环到字符串尾部

全部评论

相关推荐

粗心的雪碧不放弃:纯学历问题,我这几个月也是一直优化自己的简历,后来发现优化到我自己都觉得牛逼的时候,发现面试数量也没有提升,真就纯学历问题
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务