Leetcode 567. 字符串的排列
LeetCode 字符串 排列
2023-09-14 09:07:04 时间
给你两个字符串 s1 和 s2 ,写一个函数来判断 s2 是否包含 s1 的排列。如果是,返回 true ;否则,返回 false 。
换句话说,s1 的排列之一是 s2 的 子串 。
示例 1:
输入:s1 = "ab" s2 = "eidbaooo"
输出:true
解释:s2 包含 s1 的排列之一 ("ba").
示例 2:
输入:s1= "ab" s2 = "eidboaoo"
输出:false
提示:
- 1 <= s1.length, s2.length <= 104
- s1 和 s2 仅包含小写字母
Code:
class Solution {
public:
bool checkInclusion(string s1, string s2) {
// 排除异常的边界情况,也限定了模式串的长度
if(s1.size() > s2.size()) return false;
// 匹配采用的窗口大小为模式串大小
int windowSize = s1.size();
// 模式串的字典:可以看做一种频率分布
vector<int> hashmap1(26, 0);
// 动态更新的匹配窗口字典
vector<int> hashmap2(26, 0);
// 构建字典
for(int i = 0; i < windowSize; i++) {
hashmap1[s1[i] - 'a']++;
hashmap2[s2[i] - 'a']++;
}
// 对于每一轮滑窗查询,如果两个字典相等(频率分布一致),则命中
for(int i = windowSize; i < s2.size(); i++) {
// 两个字典相等(频率分布一致),则命中
if(hashmap1 == hashmap2) return true;
// 否则,向右滑窗:滑窗对于 hash 表的操作变为对应频率的增减
hashmap2[s2[i - windowSize] - 'a']--;
hashmap2[s2[i] - 'a']++;
}
// 整个算法采用左闭右开区间,因此最后还有一个窗口没有判断
return hashmap1 == hashmap2;
}
};
相关文章
- LeetCode每日一题-7:有效的括号
- ☆打卡算法☆LeetCode 215. 数组中的第K个最大元素 算法解析
- ☆打卡算法☆LeetCode 219. 存在重复元素 II 算法解析
- 几道入门的回溯题 | LeetCode
- Longest Common Prefix_LeetCode
- ☆打卡算法☆LeetCode 200. 岛屿数量 算法解析
- LeetCode 刷题笔记——day 6
- LeetCode 617. 合并二叉树
- LeetCode 344. 反转字符串
- JavaScript刷LeetCode拿offer-经典高频40题
- JavaScript刷LeetCode拿offer-双指针技巧Medium篇
- 前端工程师leetcode算法面试必备-二分搜索算法(下)
- Leetcode模块训练1
- 【day03】LeetCode(力扣)每日一刷[239. 滑动窗口最大值 ][1422. 分割字符串的最大得分][1046. 最后一块石头的重量 ]
- 【day08】LeetCode(力扣)每日一刷[409. 最长回文串 ][144. 二叉树的前序遍历][589. N 叉树的前序遍历 ]
- Js刷LeetCode拿offer-并查集
- LeetCode - #73 矩阵置零
- JavaScript刷LeetCode拿offer之失败-滑动窗口
- 前端工程师leetcode算法面试必备-二叉树深度广度遍历1
- 前端工程师leetcode算法面试必备-简单的二叉树
- JavaScript刷LeetCode-字符串类解题技巧4
- LeetCode 83:删除排序链表中的重复元素