经典问题,记录一下这道题解法

问题描述

给定一个字符串,找到最长子串的长度,要求子串不含不重复字符。

样例

给定"pwkpwo"的答案是是4("kpwo")。

给定"bbbbb"的答案是1("b")。

解法

1.双指针-滑动窗口

i:表示窗口左端点

j:表示窗口右端点

set存储s[i]到s[j]间的字符

如果没有重复字符,那么将当前窗口大小与目前最长的子串长度比较并更新,j++;

如果有重复字符,那么将窗口左端点右移,i++,直到窗口内不含重复字符,执行上一行

复杂度:

遍历一遍字符串s为O(n),而set里极端情况下也只存128个字符,所以插入删除是O(1)的,总的复杂度就是O(n)

public class Solution {

public int lengthOfLongestSubstring(String s) {

int n = s.length();

Set set = new HashSet<>();

int ans = 0, i = 0, j = 0;

while (i < n && j < n) {

// try to extend the range [i, j] if (!set.contains(s.charAt(j))){

set.add(s.charAt(j++));

ans = Math.max(ans, j - i);

}

else {

set.remove(s.charAt(i++));

}

}

return ans;

}

}

2.改进版滑动窗口

相比于上一种方法,改良的代码里用一个map去存各字符最近出现位置的下一个位置,好处是滑动窗口的左边缘i不用再一步步地挪了,直接一步到位

public class Solution {

public int lengthOfLongestSubstring(String s) {

int n = s.length(), ans = 0;

Map map = new HashMap<>();

for (int j = 0, i = 0; j < n; j++) {

if (map.containsKey(s.charAt(j))) {

i = Math.max(map.get(s.charAt(j)), i);

}

ans = Math.max(ans, j - i + 1);

map.put(s.charAt(j), j + 1);

}

return ans;

}

}

举个栗子

s="pwkpwo"

(1)最初,map为空,i=j=0,ans=窗口大小=j-i+1=1,更新map,记录'p'最近出现位置的下一个位置为:1

(2)i=0,j=1,窗口内无重复字符,ans=窗口大小=2,记录'w'最近出现位置的下一个位置为:2

(3))i=0,j=2,窗口内无重复字符,ans=窗口大小=3,记录'k'最近出现位置的下一个位置为:3

(4))i=0,j=3,s[j]与先前窗口内字符重复,因此需要将窗口左端点移动到让窗口不含'p'的最小位置(即map.get('p')),更新后i=1,这样s[i]到s[j]间又没有重复字符串了;同时更新'p'最近出现位置的下一个位置为:4

更新i后:

后边就不再解释了

总之这种方法的改进就是在窗口内字符与s[j]重复时,把窗口左端点一步一步挪动改进成了一步到位,但是本质上复杂度还是没有改变,依旧是O(n)

查找最长子串的长度(不重复字符) - linghu_java - 博客园​www.cnblogs.com

字符串最长不重复子串 java_最长不重复子串问题相关推荐

  1. python练习题:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度

    题目: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 题目解析: 有一个字符串,长度不定, 要找出不重复字符串的长度,我们可以这么假设,先找到第一个下标,然后从后面拿到元素的下标对 ...

  2. python输入多个字符串、输入最长的一串_无重复字符的最长子串(Python之暴力求解)...

    无重复字符的最长子串(Python之暴力求解) 例题: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例: (1) 输入: "abcabcbb" 输出: 3 ...

  3. 获取字符串中的.前面的长度_算法连载之求解不含有重复字符的最长子串长度...

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

  4. python字符串中最长的连续升序子串_Leetcode刷题练Python无重复字符的最长子串

    这是一道字符串处理算法的题目,在日常编程中,处理字符串是常见任务.该题目会涉及到一个概念"滑动窗口". 一.题目描述 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度 ...

  5. 【字符串问题】求一个字符串中重复出现的最长的子串

    2013-09-14 15:34:16 用后缀数组求一个字符串中重复出现的最长的子串. 用C++中的string类可以很方便地进行操作,需将后缀数组保存在vector<string>,如下 ...

  6. [贪心|字符串] leetcode 3 无重复字符的最长子串

    [贪心|字符串] leetcode 3 无重复字符的最长子串 1.题目 题目链接 给定一个字符串,请你找出其中不含有重复字符的最长子串的长度. 示例1: 输入: "abcabcbb" ...

  7. 数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串 (转)...

    作者:寒小阳 时间:2013年9月. 出处:http://blog.csdn.net/han_xiaoyang/article/details/11969497. 声明:版权所有,转载请注明出处,谢谢 ...

  8. python重复字符串n次的函数_LeetCode_Python(3)_无重复字符的最长子串

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

  9. 最长公共子序列算法 java_转【算法之动态规划(三)】动态规划算法之:最长公共子序列 最长公共子串(LCS)字符串相似度算法...

    1.先科普下最长公共子序列 & 最长公共子串的区别: 找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的.而最长公共子序列则并不要求连续. 2.最长公共子串 其实这是一个序贯决策问题 ...

最新文章

  1. win7环境变量设置
  2. ajax异步查询demo,ASP.NET中AJAX的异步加载(Demo演示)
  3. 有限元中单元节点和积分点的区别
  4. javascript:重新加载js文件
  5. linux报文高速捕获技术对比--napi/libpcap/afpacket/pfring/dpdk/xdp
  6. 11款实用的一句话网站设计代码
  7. 【MATLAB】用MATLAB编写阶乘函数,并调用该函数来生成一个1!,...,10!的阶乘表。
  8. SpringSecurity前后端分离
  9. 在钉钉小程序中实现录音和播放功能实例
  10. 兄dei,作为程序员的你,这些一直接触的词都念对了吗?
  11. 美团数据分析岗位面试题分享
  12. 2014年校园招聘新签约工资待遇
  13. linux将某个文件夹打包为zip文件
  14. 北航超算运行matlab,北航学子在ASC17世界大学生超级计算机竞赛全球总决赛中荣获亚军...
  15. 解决PL2303_Prolific U转串驱动在win64位系统下报error 10错误
  16. iOS13正式版来了,付刷机方法教程,苹果关闭iOS12.4验证通道
  17. InterSystems IRIS 和 IRIS for Health 2021.2 预览版发布
  18. 我们都老得太快,却聪明得太迟
  19. [洛谷 P5053] [COCI2017-2018#7] Clickbait
  20. 学软件开发的理由_成为软件开发人员的8个理由

热门文章

  1. MySQL学习笔记-B站动力节点
  2. Brute-Force算法
  3. 物联网卡系统php,物联网卡开发文案
  4. 【算法讲5:乘性函数(中)】莫比乌斯函数 | 莫比乌斯反演 | 莫比乌斯反演应用
  5. java xmpp 框架_即时聊天IM之三 XMPP协议客户端库的和Android端框架概述
  6. 优思学院|ISO13485 的五十个问题|值得收藏
  7. LoRa技术的基本认识
  8. 完整的连接器设计手册_CPCI高速背板设计与仿真
  9. [004]爬虫系列 | 中文编码问题
  10. 思科AP常见型号和WiFi标准POE标准对应表