LeetCode No3 无重复字符的最长子串
题目
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
提示:
0 <= s.length <= 5 * 104
s 由英文字母、数字、符号和空格组成
思路
题目只需要求出不含有重复字符的最长子串的长度,只需要求长度的话就简单了,利用双指针的思想,先定义一个字符set,保存当前子串的所有字符,定义一个最长子串的开始坐标back,再定义一个最长子串的结束坐标front,最长字串长度max=Math.max(max, front-back+1) , 然后使用front遍历字符串,如果set里面没有包含当前遍历到的字符,则说明当前字符和之前的都不一样,直接front++,而如果set里面包含当前遍历到的字符,则说明之前有一样的字符,这个时候就需要将back移动至上一个同样的字符所在的坐标。
AC代码
点击查看代码
class Solution {
public int lengthOfLongestSubstring(String s) {
Set<Character> chars = new HashSet<Character>();
int back = 0;
int front = 0;
int max = 0;
while(front < s.length()) {
char currentChar = s.charAt(front);
if (!chars.contains(currentChar)) {
chars.add(currentChar);
int tmpMax = front - back + 1;
if (tmpMax > max) {
max = tmpMax;
}
} else {
char backChar = s.charAt(back);
while(backChar != currentChar) {
chars.remove(backChar);
++back;
backChar = s.charAt(back);
}
++back;
}
++front;
}
return max;
}
}
低调做人,高调做事。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!