力扣算法学习计划打卡:第六天
3无重复字符的最长子串,567 字符串的排列
无重复字符的最长子串
滑动窗口/双指针
func max(a,b int)int{if a<b{return b}return a
}func lengthOfLongestSubstring(s string) int {m:=map[byte]int{}n:=len(s)ans,right:=0,-1for left:=0;left<n;left++{//左指针右移时,删除前个左指针对应的字符if left!=0{delete(m,s[left-1])}//下一个字符没到结尾且没有重复for right+1<n&&m[s[right+1]]==0{m[s[right+1]]++right++}//确定长度,若当前子串长度更长,则替换ans=max(ans,right-left+1)}return ans
}
字符串的排列
滑动窗口,设置窗口值为len(s1),因为不考虑顺序,问题为判断S2是否包含S1的排列,因此只需窗口中字符串含有的字符和s1字符相等即可
func checkInclusion(s1 string, s2 string) bool {//如果s1长度大于s2,必然不包含if len(s1)>len(s2){return false}var cnt1,cnt2 [26]int//初始化cnt1为s1的字符串字符统计,cnt2为s1第一个子串(前len(s1)个字符)for i,v:=range s1{cnt1[v-'a']++cnt2[s2[i]-'a']++}//cnt1和cnt2初始时是否相同if cnt1==cnt2{return true}//移动窗口for j:=len(s1);j<len(s2);j++{cnt2[s2[j]-'a']++cnt2[s2[j-len(s1)]-'a']--if cnt1==cnt2{return true}}return false
}
双指针,
- s1的所有元素必定在s2中,所以 s1 长度需要大于 s2 。
- 将 s1 的的元素存放在 cnt数组中(已长度26表示26个小写字母)。每有一个元素,值减一。这是为了在后面双指针方法遍历 s2 的时候,每个元素 count数为0时,才说明刚好双指针范围内符合连续条件;如果 count >0, 那么会将之前左指针向右移动
- 判断左右指针里数据长度是否跟 s1 长度一致,是即为结果。
func checkInclusion(s1, s2 string) bool {n, m := len(s1), len(s2)if n > m {return false}cnt := [26]int{}for _, ch := range s1 {cnt[ch-'a']--}left := 0for right, ch := range s2 {x := ch - 'a'cnt[x]++for cnt[x] > 0 {cnt[s2[left]-'a']--left++}if right-left+1 == n {return true}}return false
}
来源:力扣(LeetCode)
力扣算法学习计划打卡:第六天相关推荐
- 力扣算法学习计划打卡:第五天
876链表的中间结点,19删除链表的倒数第N个节点 链表的中间结点 用两个指针 slow 与 fast 一起遍历链表.slow 一次走一步,fast 一次走两步.那么当 fast 到达链表的末尾时,s ...
- 力扣算法学习计划打卡:第七天
733 图像渲染,695 岛屿的最大面积 图像渲染 广度优先搜索 var(dx = []int{1,0,-1,0}dy = []int{0,1,0,-1} ) func floodFill(image ...
- 力扣算法学习计划打卡:第八天
617.合并二叉树,116.填充每个节点的下一个右侧节点指针 合并二叉树 深度优先搜索 /*** Definition for a binary tree node.* type TreeNode s ...
- 力扣算法学习计划打卡:第二天
977有序数组的平方,排序算法复习,189轮转数组 https://leetcode-cn.com/study-plan/algorithms/?progress=lv45wk7 有序数组的平方 排序 ...
- 力扣算法学习计划打卡:第三天
283 移动零,167. 两数之和 II - 输入有序数组 移动零 不能复制数组,考虑计数0的个数,当前数组元素前存在counts个0元素,该数组元素向前移动counts个值,最后将counts个0放 ...
- 力扣算法学习计划打卡:第一天
704二分查找,278第一个错误版本,35搜索插入位置 二分查找 https://leetcode-cn.com/study-plan/algorithms/?progress=lv45wk7 顺序查 ...
- 力扣算法学习计划打卡:第四天
344反转字符串,557. 反转字符串中的单词 III 反转字符串 双指针,分别指向字符数组的头和尾,交换后,两个指针同时向中间移动 func reverseString(s []byte) {for ...
- 力扣算法学习(十四)
最小路径和 给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小. 说明:每次只能向下或者向右移动一步. 示例 1: 输入:grid = ...
- 力扣算法学习(十二)
斐波那契数 斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 .该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和.也就是: F(0) = 0,F(1) = 1 F(n) ...
最新文章
- 大场景三维点云的语义分割综述
- C#中的::运算符的作用
- python编程从入门到精通读书笔记(基础知识)
- Linux服务器编程之:truncate()函数+案例说明
- linux history命令显示时间_每天一条Linux命令(29) more (分页显示内容)
- js笔记(二)数组、对象、this
- 高精度练习(hdoj1042)
- 某大型银行深化系统技术方案之七:核心层之流程控制引擎
- 超强换元法,二重积分计算的利器(雅可比行列式超通俗讲解)
- java中长整形怎么定义_java中长整型定义
- MAC系统免驱显卡汇总
- 手机邮箱登录腾讯企业邮箱
- Bluetooth DUN 蓝牙拨号网络 (http://blog.sina.com.cn/s/blog_59b22a2e0100ildk.html)
- 如何使用开源CMS建设网站
- Gaussian常见简单报错及解决方法
- 十天学会php第五天
- unity网络实战开发(丛林战争)-前期知识准备(008-粘包和分包及解决方案)
- k8s 通过helm发布应用
- arm 64位 android,一大波64位手机处理器来袭
- signature=d0108467db7c8f306f2bd7cd45de4c83,Programmable data-routing multiplexer