无重复字符的最长子串
给定一个字符串
s
,请你找出其中不含有重复字符的最长子串的长度。
解法:
//1. 暴力解法1,比较直观
public static int lengthOfLongestSubstring(String s) {
if (s == null || s.length() == 0) return 0;
int maxLen = 0;
// 暴力法:通过保存当前无重复子串来查找
for (int i = 0; i < s.length(); i++) {
StringBuilder currentSubstring = new StringBuilder(); // 保存当前无重复子串
for (int j = i; j < s.length(); j++) {
char c = s.charAt(j);
if (currentSubstring.toString().contains(String.valueOf(c))) {
// 如果当前子串中已经包含该字符,则停止扩展
break;
}
currentSubstring.append(c); // 将当前字符加入子串
maxLen = Math.max(maxLen, currentSubstring.length()); // 更新最大长度
}
}
return maxLen;
}
//2. 暴力解法2,适用字符集为ASCII
public static int lengthOfLongestSubstring(String s) {
if (s == null || s.length() == 0) return 0;
int maxLen = 0;
// 暴力法:双重循环遍历所有可能的子串
for (int i = 0; i < s.length(); i++) {
boolean[] visited = new boolean[256]; // 假设字符集为ASCII
int j = i;
for (; j < s.length(); j++) {
if (visited[s.charAt(j)]) {
break; // 如果字符重复,停止内层循环
}
visited[s.charAt(j)] = true;
}
maxLen = Math.max(maxLen, j - i); // 更新最大长度
}
return maxLen;
}
//3. 滑动窗口法
public static int lengthOfLongestSubstring(String s) {
if(s == null || s.length() == 0) return 0;
Set<Character> occ = new HashSet<>();
int ans=0;
for(int left=0,right=0;right<s.length();right++){
while(occ.contains(s.charAt(right))){
occ.remove(s.charAt(left++));
}
occ.add(s.charAt(right));
ans=Math.max(ans,right-left+1);
}
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 让容器管理更轻松!