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
}

双指针,

  1. s1的所有元素必定在s2中,所以 s1 长度需要大于 s2 。
  2. 将 s1 的的元素存放在 cnt数组中(已长度26表示26个小写字母)。每有一个元素,值减一。这是为了在后面双指针方法遍历 s2 的时候,每个元素 count数为0时,才说明刚好双指针范围内符合连续条件;如果 count >0, 那么会将之前左指针向右移动
  3. 判断左右指针里数据长度是否跟 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)

力扣算法学习计划打卡:第六天相关推荐

  1. 力扣算法学习计划打卡:第五天

    876链表的中间结点,19删除链表的倒数第N个节点 链表的中间结点 用两个指针 slow 与 fast 一起遍历链表.slow 一次走一步,fast 一次走两步.那么当 fast 到达链表的末尾时,s ...

  2. 力扣算法学习计划打卡:第七天

    733 图像渲染,695 岛屿的最大面积 图像渲染 广度优先搜索 var(dx = []int{1,0,-1,0}dy = []int{0,1,0,-1} ) func floodFill(image ...

  3. 力扣算法学习计划打卡:第八天

    617.合并二叉树,116.填充每个节点的下一个右侧节点指针 合并二叉树 深度优先搜索 /*** Definition for a binary tree node.* type TreeNode s ...

  4. 力扣算法学习计划打卡:第二天

    977有序数组的平方,排序算法复习,189轮转数组 https://leetcode-cn.com/study-plan/algorithms/?progress=lv45wk7 有序数组的平方 排序 ...

  5. 力扣算法学习计划打卡:第三天

    283 移动零,167. 两数之和 II - 输入有序数组 移动零 不能复制数组,考虑计数0的个数,当前数组元素前存在counts个0元素,该数组元素向前移动counts个值,最后将counts个0放 ...

  6. 力扣算法学习计划打卡:第一天

    704二分查找,278第一个错误版本,35搜索插入位置 二分查找 https://leetcode-cn.com/study-plan/algorithms/?progress=lv45wk7 顺序查 ...

  7. 力扣算法学习计划打卡:第四天

    344反转字符串,557. 反转字符串中的单词 III 反转字符串 双指针,分别指向字符数组的头和尾,交换后,两个指针同时向中间移动 func reverseString(s []byte) {for ...

  8. 力扣算法学习(十四)

    最小路径和 给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小. 说明:每次只能向下或者向右移动一步. 示例 1: 输入:grid = ...

  9. 力扣算法学习(十二)

    斐波那契数 斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 .该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和.也就是: F(0) = 0,F(1) = 1 F(n) ...

最新文章

  1. 大场景三维点云的语义分割综述
  2. C#中的::运算符的作用
  3. python编程从入门到精通读书笔记(基础知识)
  4. Linux服务器编程之:truncate()函数+案例说明
  5. linux history命令显示时间_每天一条Linux命令(29) more (分页显示内容)
  6. js笔记(二)数组、对象、this
  7. 高精度练习(hdoj1042)
  8. 某大型银行深化系统技术方案之七:核心层之流程控制引擎
  9. 超强换元法,二重积分计算的利器(雅可比行列式超通俗讲解)
  10. java中长整形怎么定义_java中长整型定义
  11. MAC系统免驱显卡汇总
  12. 手机邮箱登录腾讯企业邮箱
  13. Bluetooth DUN 蓝牙拨号网络 (http://blog.sina.com.cn/s/blog_59b22a2e0100ildk.html)
  14. 如何使用开源CMS建设网站
  15. Gaussian常见简单报错及解决方法
  16. 十天学会php第五天
  17. unity网络实战开发(丛林战争)-前期知识准备(008-粘包和分包及解决方案)
  18. k8s 通过helm发布应用
  19. arm 64位 android,一大波64位手机处理器来袭
  20. signature=d0108467db7c8f306f2bd7cd45de4c83,Programmable data-routing multiplexer

热门文章

  1. DG4V-5系列电磁阀配套线圈6033556-001
  2. 阿里云使用体验-阿里云开发者社区
  3. go语言基础(二)函数,数组,指针,结构体
  4. Ftp下载文件超时处理
  5. 我们真的在被 APP “窃听” 么?
  6. wiki的备份以及迁移方式
  7. C/C++ printf 输入16进制文本数据 多出许多ffffff的问题
  8. [usOJ5528]小奇的旅行计划
  9. 基于Python的SQLite基础知识学习
  10. 使用joda_time计算两时间的月数差,天数差