什么是滑动窗口?

其实就是一个队列,比如例题中的 abcabcbb,进入这个队列(窗口)为 abc 满足题目要求,当再进入 a,队列变成了 abca,这时候不满足要求。所以,我们要移动这个队列!我们只要把队列的左边的元素移出就行了,直到满足题目要求!一直维持这样的队列,找出队列出现最长的长度时候,求出解!时间复杂度:O(n)

题目:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

输入: "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

class Solution:def lengthOfLongestSubstring(self, s: str) -> int:if not s:return 0left = 0lookup = set()n = len(s)max_len = 0cur_len = 0for i in range(n):cur_len += 1while s[i] in lookup:lookup.remove(s[left])left += 1cur_len -= 1if cur_len > max_len:max_len = cur_lenlookup.add(s[i])return max_len

或者使用字典dict:

class Solution:def lengthOfLongestSubstring(self, s):""":type s: str:rtype: int"""from collections import defaultdictlookup = defaultdict(int)start = 0end = 0max_len = 0counter = 0while end < len(s):if lookup[s[end]] > 0:counter += 1lookup[s[end]] += 1end += 1while counter > 0:if lookup[s[start]] > 1:#例如 abdhbcounter -= 1lookup[s[start]] -= 1start += 1max_len = max(max_len, end - start)return max_len

最长公共连续子串(Longest Common Substring)

给定字符串str = "ABCDADNENXY"

子序列:从str中任意去掉若干个(含0个)字符,剩下的就是这个str的子序列,如ABC, ABXY, DADXY等,中间不必连续.

子串:和子序列不同,子串必须是连续的,如ABCD,ENXY,CDADNE都是子串,而AXY不是,因为中间断开了,把连续.

子串必定是子序列,子序列不一定是子串.

问题:有两个字符串str和str2,求出两个字符串中最长公共子串长度。

比如:str=acbcbcef,str2=abcbced,则str和str2的最长公共子串为bcbce,最长公共子串长度为5。

算法思路:

1、把两个字符串分别以行和列组成一个二维矩阵。

2、比较二维矩阵中每个点对应行列字符中否相等,相等的话值设置为1,否则设置为0。

3、通过查找出值为1的最长对角线就能找到最长公共子串。

针对于上面的两个字符串我们可以得到的二维矩阵如下:

从上图可以看到,str1和str2共有5个公共子串,但最长的公共子串长度为5。

为了进一步优化算法的效率,我们可以再计算某个二维矩阵的值的时候顺便计算出来当前最长的公共子串的长度,即某个二维矩阵元素的值由record[i][j]=1演变为record[i][j]=1 +record[i-1][j-1],这样就避免了后续查找对角线长度的操作了。修改后的二维矩阵如下:

LCS问题就是求两个字符串最长公共子串的问题。解法就是用一个矩阵来记录两个字符串中所有位置的两个字符之间的匹配情况,若是匹配则为1,否则为0。然后求出对角线最长的1的序列,其对应的位置就是最长匹配子串的位置。

def find_lcsubstr(s1, s2):   m=[[0 for i in range(len(s2)+1)]  for j in range(len(s1)+1)]  #生成0矩阵,为方便后续计算,比字符串长度多了一列  mmax=0   #最长匹配的长度  p=0  #最长匹配对应在s1中的最后一位  for i in range(len(s1)):  for j in range(len(s2)):  if s1[i]==s2[j]:  m[i+1][j+1]=m[i][j]+1  if m[i+1][j+1]>mmax:  mmax=m[i+1][j+1]  p=i+1  return s1[p-mmax:p],mmax   #返回最长子串及其长度  print find_lcsubstr('abcdfg','abdfg')  

C++:

string getLCS(string str1, string str2) {vector<vector<int> > record(str1.length(), vector<int>(str2.length()));int maxLen = 0, maxEnd = 0;for(int i=0; i<static_cast<int>(str1.length()); ++i)for (int j = 0; j < static_cast<int>(str2.length()); ++j) {if (str1[i] == str2[j]) {if (i == 0 || j == 0) {record[i][j] = 1;}else {record[i][j] = record[i - 1][j - 1] + 1;}}else {record[i][j] = 0;}if (record[i][j] > maxLen) {maxLen = record[i][j];maxEnd = i; //若记录i,则最后获取LCS时是取str1的子串}}return str1.substr(maxEnd - maxLen + 1, maxLen);
}

from:https://blog.csdn.net/qq_25800311/article/details/81607168

from:https://blog.csdn.net/baobao3456810/article/details/79770367

滑动窗口法LeetCode相关推荐

  1. leetcode Longest Substring with At Most Two Distinct Characters 滑动窗口法

    题目解析 代码如下 题目解析 这一题是一道会员的题目,题目介绍如下: Given a string, find the length of the longest substring T that c ...

  2. leetcode 3. Longest Substring Without Repeating Characters 最长非重复子串的长度 滑动窗口法

    题目链接 根据我们之前介绍的滑动窗口法的解法: 滑动窗口法详解 leetcode 438. Find All Anagrams in a String 滑动窗口法 这题,我们不难解决,使用之前的模板. ...

  3. 【LeetCode】无重复字符的最长子串【滑动窗口法】

    给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc&qu ...

  4. leetcode 30. Substring with Concatenation of All Words 与所有单词相关联的字串 滑动窗口法

    题目描述 给定一个字符串 s 和一些长度相同的单词 words.在 s 中找出可以恰好串联 words 中所有单词的子串的起始位置. You are given a string, s, and a ...

  5. leetcode 567. Permutation in String 字符串的排列 滑动窗口法

    题目 给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列.换句话说,第一个字符串的排列之一是第二个字符串的子串. 示例1:输入: s1 = "ab" s ...

  6. leetcode 438. Find All Anagrams in a String 滑动窗口法

    题目链接 解析 主要使用滑动窗口法解题,需要好好体会的是中间的两个判断couter的用法,这里很巧妙. 如果想了解更多的滑动窗口法内容,看这里: 滑动窗口法详解 代码 from collections ...

  7. 算法与数据结构(一):滑动窗口法总结

    滑窗法在算法题中大量应用,其思想简洁强大,但是往往在维护左右指针时候容易出错,现总结整理如下: 1. 介绍 滑动窗口法,也叫尺取法(可能也不一定相等,大概就是这样 =.=),可以用来解决一些查找满足一 ...

  8. 利用滑动窗口法解决无重复字符的最长子串

    无重复字符的最长子串 题目描述: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最 ...

  9. 滑动窗口最大值-leetcode 239题

    给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以看到在滑动窗口内的 k 个数字.滑动窗口每次只向右移动一位. 返回滑动窗口中的最大值. 来源:力扣(L ...

最新文章

  1. appid 参数错误_辽宁罗茨风机参数
  2. 电子书下载:Pro Drupal 7 for Windows Developers
  3. Java异常日志的查询语句_java学习异常,断言和日志
  4. ADO.NET实用经验 转载
  5. 神秘的安全测试思考案例(一)
  6. 最多分成多少块(51Nod-2502)
  7. Star Schema完全参考手册学习笔记六
  8. java接口构造方法吗_Java中抽象类和接口中有构造方法吗?
  9. 分析频域滤波和空域滤波的各自特点_同态滤波原理及其matlab实现
  10. android post 提交数据
  11. 【运动检测】基于matlab最大互信息运动目标检测【含Matlab源码 1607期】
  12. 国内做得好的进销存软件有哪些啊?
  13. 求不规则立方体表面积java_不规则立方体体积计算
  14. 电力行业巡检对讲通信系统
  15. 超星高级语言程序设计实验作业 (实验02 分支与循环程序设计)(三)
  16. css td 强制换行,css表格强制换行
  17. 电脑 蓝屏 问题签名: 问题事件名称: BlueScreen OS 版本: 6.1.7600.2.0.0.256.1 区域设置 ID: 2052...
  18. 数据控制—完整性约束
  19. 维度表创建规范_数据仓库维度建模-维度表设计
  20. 我不相信长夜将至,因为火把就在自己手中。

热门文章

  1. 软考高级网络规划设计师论文考试技巧
  2. Cocos2d-x 结合Box2D开发Android游戏配置方法
  3. 用Python操作MySQL(pymysql)
  4. JAVA-date(计算时间差)
  5. 1.视频压缩编码综述
  6. 【例题5-6 UVA 540 】Team Queue
  7. C# 循环语句 for
  8. 轻量级前端MVVM框架avalon - 整体架构
  9. Win下的port forwarding
  10. ubuntu 系统相关