当前位置:网站首页>剑指offer 48:最长不重复子串
剑指offer 48:最长不重复子串
2022-07-30 07:42:00 【勇敢小姚】
题目描述:
请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
解法一:滑动窗口
思路:
首先,left和right同时指向窗口头部,右窗口不断右移动,用Set维护一个不重复的滑动窗口,当遇到重复元素,即刻移动左窗口,去重,同时记录此时窗空口的长度。然后重复前述步骤,直到窗口遍历完全部元素。
代码:
class Solution {
public int lengthOfLongestSubstring(String s) {
int res = 0;
Set<Character> set = new HashSet<>();
for(int l = 0, r = 0; r < s.length(); r++) {
char c = s.charAt(r);
while(set.contains(c)) {
set.remove(s.charAt(l++));
}
set.add(c);
res = Math.max(res, r - l + 1);
}
return res;
}
}解法二:双端队列
思路:
用一个双端队列当成滑动窗口,当遇到队列中已经存在的数,就从队头开始删(直到删除这个存在的数),否则就从队尾添加元素
代码:
class Solution {
public int lengthOfLongestSubstring(String s) {
Deque<Character> deque = new ArrayDeque<>();
int max=0;
for (int i = 0; i < s.length(); i++) {
if (!deque.contains(s.charAt(i))) {
deque.addLast(s.charAt(i));
}else {
max = Math.max(max, deque.size());
while(deque.peekFirst()!=s.charAt(i)) {
deque.removeFirst();
}
deque.removeFirst();
deque.addLast(s.charAt(i));
}
}
max = Math.max(max, deque.size());
return max;
}
}
边栏推荐
猜你喜欢
随机推荐
Thinking about digital transformation of construction enterprises in 2022, the road to digital transformation of construction enterprises
【网络攻防】常见的网络攻防技术——黑客攻防(通俗易懂版)
test4
SQL的ROUND函数用法及其实例
sql注入数据库原理详解
SQL window function
hcip第八天
typescript7-typescript常用类型
Delphi仿制Web的导航
SQL行列转换
typescript4 - installs a toolkit for compiling ts
39.【vector动态数组定义及初始化】
经典毕业设计:基于SSM实现高校后勤报修系统
Why does typescript2-typescript add type support to js
typescript6 - simplify the steps to run ts
集合相关Collection
ES:class 的基本使用
「活动推荐」探索未来:数字科技
求大佬解答,这种 sql 应该怎么写?
保存在 redis中的token 如何续期?








