【滑动窗口+字符计数数组】LCR_014_字符串的排列

求解代码

java 复制代码
public boolean checkInclusion(String s1, String s2) {
        if (s1.length() > s2.length()) {
            return false;
        }

        int[] a = new int[26]; // 统计s1的字符出现次数
        int[] b = new int[26]; // 统计s2滑动窗口内的字符出现次数

        for (int i = 0; i < s1.length(); i++) {
            a[s1.charAt(i) - 'a']++; // s1的第i个字符对应数组下标(如'a'→0,'b'→1),计数+1
            b[s2.charAt(i) - 'a']++; // 先统计s2前s1.length()个字符的计数
        }

        //用于比较两个数组的内容是否完全相等
        if (Arrays.equals(a, b)) {
            return true;
        }

        // 初始窗口是[0, s1.length()-1],右边界从s1.length()开始
        int left = 0;
        int right = s1.length();

        while (right < s2.length()) {
            // 右边界字符加入窗口:计数+1
            b[s2.charAt(right) - 'a']++;
            // 左边界字符移出窗口:计数-1
            b[s2.charAt(left) - 'a']--;

            // 检查当前窗口计数是否匹配
            if (Arrays.equals(a, b)) {
                return true;
            }

            // 窗口右移:左、右边界各+1
            right++;
            left++;
        }

        return false;
    }
相关推荐
呱牛do it16 小时前
企业级门户网站设计与实现:基于SpringBoot + Vue3的全栈解决方案(Day 3)
java·vue
神の愛17 小时前
左连接查询数据 left join
java·服务器·前端
t***54417 小时前
如何配置Orwell Dev-C++使用Clang
开发语言·c++
CoderCodingNo17 小时前
【信奥业余科普】C++ 的奇妙之旅 | 13:为什么 0.1+0.2≠0.3?——解密“爆int”溢出与浮点数精度的底层原理
开发语言·c++
南境十里·墨染春水17 小时前
linux学习进展 线程同步——互斥锁
java·linux·学习
雨奔17 小时前
Kubernetes 联邦 Deployment 指南:跨集群统一管理 Pod
java·容器·kubernetes
杨凯凡17 小时前
【021】反射与注解:Spring 里背后的影子
java·后端·spring
lulu121654407817 小时前
Claude Code项目大了响应慢怎么办?Subagents、Agent Teams、Git Worktree、工作流编排四种方案深度解析
java·人工智能·python·ai编程
riNt PTIP17 小时前
SpringBoot创建动态定时任务的几种方式
java·spring boot·spring
alexhilton18 小时前
Compose中的CameraX二维码扫描器
android·kotlin·android jetpack