LeetCode——567. 字符串的排列(Permutation in String)——分析及代码(Java)

news/2025/2/21 19:06:08

LeetCode——567. 字符串的排列[Permutation in String]——分析及代码[Java]

  • 一、题目
  • 二、分析及代码
    • 1. 滑动窗口
      • (1)思路
      • (2)代码
      • (3)结果
  • 三、其他

一、题目

给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列。
换句话说,第一个字符串的排列之一是第二个字符串的子串。

示例1:

输入: s1 = "ab" s2 = "eidbaooo"
输出: True
解释: s2 包含 s1 的排列之一 ("ba").

示例2:

输入: s1= "ab" s2 = "eidboaoo"
输出: False

注意:

  • 输入的字符串只包含小写字母
  • 两个字符串的长度都在 [1, 10,000] 之间

来源:力扣(LeetCode
链接:https://leetcode-cn.com/problems/permutation-in-string
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、分析及代码

1. 滑动窗口

(1)思路

字符串的排列之一是另一字符串的子串,即二者拥有的字母种类及个数相同。
可在 s2 上设计一个与 s1 长度相同的滑动窗口,通过计算窗口中各字母的种类及个数是否与 s1 相同,判断是否存在满足题意的解。

(2)代码

class Solution {
    public boolean checkInclusion(String s1, String s2) {
        int len = s1.length(), n = s2.length(), delta = 0;//delta为存在个数差异的字符数量
        if (n < len)
            return false;
        int[] ch = new int[26];
        char[] c1 = s1.toCharArray(), c2 = s2.toCharArray();
        for(char c : c1) {
            if (ch[c - 'a']++ == 0)
                delta++;
        }
        //初始化滑动窗口
        for (int i = 0; i < len; i++) {
            switch (ch[c2[i] - 'a']--) {
                case 0:
                    delta++;
                    break;
                case 1:
                    delta--;
                    break;
            }
        }
        if (delta == 0)
           return true;
        //滑动窗口移动
        for (int i = len; i < n; i++) {
            switch (ch[c2[i] - 'a']--) {
                case 0:
                    delta++;
                    break;
                case 1:
                    delta--;
                    break;
            }
            switch (ch[c2[i - len] - 'a']++) {
                case 0:
                    delta++;
                    break;
                case -1:
                    delta--;
                    break;
            }
            if (delta == 0)
                return true;
        }
        return false;
    }
}

(3)结果

执行用时 :3 ms,在所有 Java 提交中击败了 99.88% 的用户;
内存消耗 :38.7 MB,在所有 Java 提交中击败了 29.94% 的用户。

三、其他

暂无。


http://www.niftyadmin.cn/n/616177.html

相关文章

检验一下你到底会不会ThreadLocal,来摸个底~,,,文章将抛出7个问题

问题 和Synchronized的区别存储在jvm的哪个区域真的只是当前线程可见吗会导致内存泄漏么为什么用Entry数组而不是Entry对象你学习的开源框架哪些用到了ThreadLocalThreadLocal里的对象一定是线程安全的吗 概述 ThreadLocal类是用来提供线程内部的局部变量。让这些变量在多线…

提供一个简单的ThreadLocal工具类,请笑纳好啊好啊

这个简单了&#xff0c;不多说&#xff0c;直接上代码 package com.duoku.base.util;import com.google.common.collect.Maps; import org.springframework.core.NamedThreadLocal;import java.util.Map;/*** Description:** */ public class ThreadLocalUtil {private static…

【C语言】一篇文章看透,函数剥离到头文件中引用.(实例分析)

作者目前就读于&#xff0c;双非本科&#xff0c;大一&#xff0c;很多地方理解不当还望各位大佬耐心教导。万分感谢&#xff01; 本文为C语言的小事系列&#xff0c;喜欢的同志可以订阅本专栏点→这里都是在下学习时总结的精华&#xff0c;希望对您有所帮助。 开门见山的说&am…

LeetCode——119. 杨辉三角 II(Pascal‘s Triangle II)——分析及代码(Java)

LeetCode——119. 杨辉三角 II[Pascals Triangle II]——分析及代码[Java]一、题目二、分析及代码1. 直接计算&#xff08;1&#xff09;思路&#xff08;2&#xff09;代码&#xff08;3&#xff09;结果三、其他一、题目 给定一个非负索引 k&#xff0c;其中 k ≤ 33&#x…

LeetCode——703. 数据流中的第 K 大元素(Kth Largest Element in a Stream)——分析及代码(Java)

LeetCode——703. 数据流中的第 K 大元素[Kth Largest Element in a Stream]——分析及代码[Java]一、题目二、分析及代码1. 堆&#xff08;优先队列&#xff09;&#xff08;1&#xff09;思路&#xff08;2&#xff09;代码&#xff08;3&#xff09;结果三、其他一、题目 设…

兄弟,怒我直言,你真的完全了解static关键字吗

前言 说到static关键字&#xff0c;只能给初学者几点建议(高手让道哦),就像我刚学java的那些年一样&#xff0c;总的来说&#xff1a; static 关键字可用于变量、方法、代码块和内部类&#xff0c;表示某个特定的成员只属于某个类本身&#xff0c;而不是该类的某个对象。 一一…

关于JAVA枚举类,你知道的有多少,下面一起学习学习吧

前言 enum&#xff08;枚举&#xff09;是 Java 1.5 时引入的关键字&#xff0c;它表示一种特殊类型的类&#xff0c;默认继承自 java.lang.Enum。 举例 为了证明这一点&#xff0c;我们来新建一个枚举 PlayerType&#xff1a; public enum PlayerType {TENNIS,FOOTBALL,BA…

LeetCode——765. 情侣牵手(Couples Holding Hands)——分析及代码(Java)

LeetCode——765. 情侣牵手[Couples Holding Hands]——分析及代码[Java]一、题目二、分析及代码1. 并查集&#xff08;1&#xff09;思路&#xff08;2&#xff09;代码&#xff08;3&#xff09;结果三、其他一、题目 N 对情侣坐在连续排列的 2N 个座位上&#xff0c;想要牵…