字符串最长不重复子串 java_最长不重复子串问题
经典问题,记录一下这道题解法
问题描述
给定一个字符串,找到最长子串的长度,要求子串不含不重复字符。
样例
给定"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_最长不重复子串问题相关推荐
- python练习题:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度
题目: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 题目解析: 有一个字符串,长度不定, 要找出不重复字符串的长度,我们可以这么假设,先找到第一个下标,然后从后面拿到元素的下标对 ...
- python输入多个字符串、输入最长的一串_无重复字符的最长子串(Python之暴力求解)...
无重复字符的最长子串(Python之暴力求解) 例题: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例: (1) 输入: "abcabcbb" 输出: 3 ...
- 获取字符串中的.前面的长度_算法连载之求解不含有重复字符的最长子串长度...
问题 给定一个字符串,找出其中不含有重复字符的最长子串长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc" ...
- python字符串中最长的连续升序子串_Leetcode刷题练Python无重复字符的最长子串
这是一道字符串处理算法的题目,在日常编程中,处理字符串是常见任务.该题目会涉及到一个概念"滑动窗口". 一.题目描述 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度 ...
- 【字符串问题】求一个字符串中重复出现的最长的子串
2013-09-14 15:34:16 用后缀数组求一个字符串中重复出现的最长的子串. 用C++中的string类可以很方便地进行操作,需将后缀数组保存在vector<string>,如下 ...
- [贪心|字符串] leetcode 3 无重复字符的最长子串
[贪心|字符串] leetcode 3 无重复字符的最长子串 1.题目 题目链接 给定一个字符串,请你找出其中不含有重复字符的最长子串的长度. 示例1: 输入: "abcabcbb" ...
- 数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串 (转)...
作者:寒小阳 时间:2013年9月. 出处:http://blog.csdn.net/han_xiaoyang/article/details/11969497. 声明:版权所有,转载请注明出处,谢谢 ...
- python重复字符串n次的函数_LeetCode_Python(3)_无重复字符的最长子串
需求 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc ...
- 最长公共子序列算法 java_转【算法之动态规划(三)】动态规划算法之:最长公共子序列 最长公共子串(LCS)字符串相似度算法...
1.先科普下最长公共子序列 & 最长公共子串的区别: 找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的.而最长公共子序列则并不要求连续. 2.最长公共子串 其实这是一个序贯决策问题 ...
最新文章
- win7环境变量设置
- ajax异步查询demo,ASP.NET中AJAX的异步加载(Demo演示)
- 有限元中单元节点和积分点的区别
- javascript:重新加载js文件
- linux报文高速捕获技术对比--napi/libpcap/afpacket/pfring/dpdk/xdp
- 11款实用的一句话网站设计代码
- 【MATLAB】用MATLAB编写阶乘函数,并调用该函数来生成一个1!,...,10!的阶乘表。
- SpringSecurity前后端分离
- 在钉钉小程序中实现录音和播放功能实例
- 兄dei,作为程序员的你,这些一直接触的词都念对了吗?
- 美团数据分析岗位面试题分享
- 2014年校园招聘新签约工资待遇
- linux将某个文件夹打包为zip文件
- 北航超算运行matlab,北航学子在ASC17世界大学生超级计算机竞赛全球总决赛中荣获亚军...
- 解决PL2303_Prolific U转串驱动在win64位系统下报error 10错误
- iOS13正式版来了,付刷机方法教程,苹果关闭iOS12.4验证通道
- InterSystems IRIS 和 IRIS for Health 2021.2 预览版发布
- 我们都老得太快,却聪明得太迟
- [洛谷 P5053] [COCI2017-2018#7] Clickbait
- 学软件开发的理由_成为软件开发人员的8个理由