567. 字符串的排列
时间:2023-03-18
本文章向大家介绍567. 字符串的排列,主要内容包括题目描述、思路分析、代码参考、使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目描述
给定字符串s1和s2,判断s2是否存在s1的子串
eg: s2:'acbdefa',s1:'db' return:true
思路分析
定长窗口移动,还是采用滑动窗口的思路去解
窗口的right指针依次向右移动,维护一个window和needs
必须是定长窗口,因此当窗口大小应当等于right-left==s1.length
当window的长度大于s1.length时就开始缩小窗口,
缩小时就判断当前的valid是否等于needs的大小,如果是则直接返回true
如果不是则更新windows的大小
代码参考
// 给定字符串s1和s2,判断s2是否存在s1的子串
// eg: s2:'acbdefa',s1:'db' return:true
const checkInclusion = function (s1, s2) {
// 创建needs以及window窗口
const needs = new Map()
const window = new Map()
for (let i of s1) {
needs.set(i, (needs.get(i) || 0) + 1)
}
let left = right = 0
let valid = 0
// right指针向右移动
while (right < s2.length) {
let c = s2[right]
right++
if (needs.has(c)) {
window.set(c, (window.get(c) || 0) + 1)
if (needs.get(c) === window.get(c)) valid++
}
// 窗口收缩条件,因为是定长窗口,也就是窗口的长度最小为s1.length
while (right - left >= s1.length) {
if (valid === needs.size) return true
let d = s2[left]
left++
if (needs.has(d)) {
if (window.get(d) === needs.get(d)) valid--
window.set(d, window.get(d) - 1)
}
}
}
return false
}
// 如果s1中不存在重复字母的话可以参考下列写法
// 采用定长窗口,一直向右移动
// const checkInclusion2 = function(s1, s2) {
// let left = 0,right = s1.length
// while(right<=s2.length){
// let str = s2.slice(left,right)
// let valid = 0
// for(let i = 0;i<s1.length;i++){
// // console.log(str,s1[i],str.includes(s1[i]),valid)
// if(str.includes(s1[i])) valid++
// if(!str.includes(s1[i])) break
// if(valid===s1.length) return true
// }
// right++,left++
// }
// return false
// };
原文地址:https://www.cnblogs.com/zx529/p/17229226.html
- Java中处理正则表达式的工具类——总有一个适合你
- 【Spark研究】用Apache Spark进行大数据处理第一部分:入门介绍
- “一切都是消息”--MSF(消息服务框架)入门简介
- 【Spark研究】用Apache Spark进行大数据处理第二部分:Spark SQL
- Android基础总结(2)——活动Activity
- Java实现的IP处理工具类——可用于项目
- 使用SQLServer同义词和SQL邮件,解决发布订阅中订阅库丢失数据的问题
- 一次误报引发的DNS检测方案的思考:DNS隧道检测平民解决方案
- Andriod基础——Adapter类
- ORM查询语言(OQL)简介--高级篇:脱胎换骨
- 用Java实现处理日期的工具类——常用日期处理方法
- ORM查询语言(OQL)简介--实例篇
- 漏洞预警 | 海洋CMS(SEACMS)0day漏洞预警
- 【机器学习】分类算法评价
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 大佬的思路就是不一样,这是我见过最简洁又清晰的SSM框架整合
- SQL Server重置自增的值为0
- 被经理邀请去“爬山”,只是因为我写错了一条SQL语句?
- Maven环境配置-必会
- Centos7中Docker安装RabbitMQ
- 又陷入知识盲区了,面试被问Redis事务,我差点脸都“绿”了
- Mybatis中#{}与${}的区别
- POI合并单元格
- Centos7.x安装Docker
- 实在是妙啊!Java中强软虚弱引用,居然还能这样去操作
- 数据库连接池引起的FullGC问题,看我如何一步步排查、分析、解决
- Swift 数组dropFirst方法
- Swift 类方法和实例方法
- 我从未见过的牛逼解说方式!Redis五种数据结构,看一遍就懂了
- Swift 动态创建ViewController