剑指 Offer 48. 最长不含重复字符的子字符串
剑指 Offer 48. 最长不含重复字符的子字符串
对于字符串区间类题目,一般可以考虑使用滑动窗口来求解问题。
在滑动窗口中一般设置l和r两个指针,l指针指向窗口的左边缘,r指针指向窗口的右边缘,整个窗口的大小为r - l + 1
。
在本题中,再用一个map或者set来查看窗口是否有重复数字,这里我为了方便一些用的是长为128的数组,正好可以存储下所有字符类型。
遍历到r位置的字符时,将r位置字符的次数加上1,若其正好为1,则说明之前的窗口中没有出现过r位置的字符,窗口扩大,r指针前移;
若r位置的字符出现次数大于1,则说明之前的窗口中出现过这个字符,窗口需要从左边缘开始收缩窗口,收缩时,需要满足l <= r && map[chars[r]] > 1
,也就是确保窗口中不会有重复字符且不让窗口的左边缘超过右边缘。收缩的过程为:l指针前移,窗口中l指针位置指向的字符次数相应减少。此时窗口中没有重复字符了,继续扩大窗口r++。
class Solution {
public int lengthOfLongestSubstring(String s) {
int n = s.length(), ans = 0;
if(n == 0) return 0;
if(n == 1) return 1;
char[] chars = s.toCharArray();
int l = 0, r = 0;
int[] map = new int[128];
while(r < n) {
map[chars[r]]++;
if(map[chars[r]] == 1) {
// 窗口前移
ans = Math.max(r - l + 1, ans);
r++;
} else if (map[chars[r]] > 1){
// 窗口缩小
while(l <= r && map[chars[r]] > 1) {
map[chars[l]]--;;
l++;
}
// 无重复字符了,进一步扩大窗口
r++;
}
}
return ans;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!