java:输入一个字符串,在其中寻找长度最长的,不含重复字符的字符串,如果有多个长度相同的最长子字符串,则全部输出子字符串
public class test2 {
public static List<String> findLongestSubstring(String s) {
List<String> result = new ArrayList<>();
int n = s.length();
Map<Character, Integer> map = new HashMap<>();
int start = 0, end = 0, len = 0;
while (end < n) {
char c = s.charAt(end);
if (map.containsKey(c)) {
start = Math.max(start, map.get(c) + 1);
}
map.put(c, end);
if (end - start + 1 > len) {
len = end - start + 1;
result.clear();
result.add(s.substring(start, end + 1));
} else if (end - start + 1 == len) {
result.add(s.substring(start, end + 1));
}
end++;
}
return result;
}
public static void main(String[] args) {
String s = "abcabcbb";
List<String> result = findLongestSubstring(s);
System.out.println(result);
}
}
该代码的核心思想是
使用哈希表存储每个字符最近一次出现的位置。遍历字符串时,如果遇到重复字符,更新起始位置为上一个该字符的位置加一。
同时,记录下最长的子字符串长度和所有长度相同的子字符串。最后返回所有长度相同的子字符串。
上面的代码中,
主要的时间复杂度来自于遍历字符串和哈希表的操作。遍历字符串的时间复杂度为O(n),其中n是字符串的长度。每个字符在哈希表中的查找和更新都需要O(1)的时间。因此,总的时间复杂度为O(n)。
空间复杂度方面,哈希表最多存储不同字符的数量,因此空间复杂度为O(k),其中$k$是不同字符的数量。在本题中,由于只考虑ASCII码字符,因此$k$的最大值为$128$。因此,空间复杂度为O(1)。
综上所述,该算法的时间复杂度为O(n),空间复杂度为O(1)。这是一个非常高效的算法,可以在很短的时间内找到最长的不含重复字符的子字符串。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)