滑动窗口+负债表

2022-05-12:小歪每次会给你两个字符串:
笔记s1和关键词s2,请你写一个函数,
判断s2的排列之一是否是s1的子串。
如果是,返回true;
否则,返回false。
来自字节飞书团队

代码(java):

点击查看代码
int b=0;
b-- ==0  //先进行判断,后进行减法操作,这是一个知识误区。

public boolean stringCheckPlus(String s1,String s2){
        //简单判断
        if (s1.length()<s2.length()) return false;
        //s2变成数组
        char[] str2 = s2.toCharArray();
        //新建负债表
        int[] count = new int[256];
        //循环放入s2的值
        for (int i=0;i<str2.length;i++) count[str2[i]]++;
        //记录s2的大小
        int M = str2.length;
        //s1变成数组
        char[] st1 = s1.toCharArray();
        //记录s1中的失效元素
        int inValidTimes =0;
        //记录起点
        int R=0;
        for (;R<M;R++){
            //判断是否是失效元素
            if (count[st1[R]]--<=0){
                //失效元素加一
                inValidTimes++;
            }
        }
        //遍历剩下的元素
        for (;R< st1.length;R++){
            //判断失效元素个数
            if (inValidTimes ==0){
                return true;
            }
            //判断接下来的s1元素是否是失效元素
            if (count[st1[R]]--<=0){
                inValidTimes++;
            }
            //判断s1开头排出去的元素是否是失效元素,并进行归还元素值。
            if (count[st1[R-M]]++ <0){
                inValidTimes--;
            }
        }
        //判断失效元素是否和0相等
        return inValidTimes ==0;
    }


posted @ 2022-05-16 22:26  一棵小萌新  阅读(31)  评论(0)    收藏  举报