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)。这是一个非常高效的算法,可以在很短的时间内找到最长的不含重复字符的子字符串。
标签:字符,end,java,复杂度,start,result,字符串,长度 From: https://www.cnblogs.com/me-me/p/17366556.html