无重复字符的最长子串

滑动窗口求无重复最长子串

java实现,以求无重复最长子串的题目为例

题目

例如输入: s = “abcabcd”

因为无重复字符的最长子串是 “abcd”,所以其长度为 4。

滑动窗口

理解为一个可以移动的窗口,窗口中的值都是符合要求的(以该题为例,即窗口中字符不重复)

代码实现

class Solution {public int lengthOfLongestSubstring(String s) {if (s.length()==0) return 0;
​        HashMap<Character, Integer> map = new HashMap<Character, Integer>();int max = 0;//记录最长字符串的值int label = 0;//滑动窗口的下标起点,i为窗口终点for(int i = 0; i < s.length(); i ++){if(map.containsKey(s.charAt(i))){//判断有无重复字符
​                label = Math.max(label,map.get(s.charAt(i)) + 1);//出现相同的字符时,修改滑动窗口起点(相当于开启一个新的滑动窗口进行记录)}
​            map.put(s.charAt(i),i);//每个字符都加到map,值为其下标
​            max = Math.max(max,i-left + 1);//比较当前最大值与当前滑动窗口的长度}return max;}

}

复杂度

时间复杂度:O(N),一个for循环,哈希的运算当做O(1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值