尺取法,字符串

图片说明

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,还是要比较最小长度的),一直循环到字符串尾部

全部评论

相关推荐

每晚夜里独自颤抖:你cet6就cet6,cet4就cet4,你写个cet证书等是什么意思。专业技能快赶上项目行数,你做的这2个项目哪里能提现你有这么多技能呢
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
昨天 12:11
我最近都有点不想活了,天天早10晚11的,还问我爱不爱她目前的状态别说爱谁了,没扇谁就不错了。是不是大家都是一进节子,只有工作没有爱情了
AzureSkies:在字节的时候找的就是字节的,飞书太适合恋爱人士了,能看到是不是已读,是不是在会议中。简直冥婚好伴侣
投递字节跳动等公司9个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务