/**
* 给定一个字符串 s ,请你找出其中不含有重复字符的最长子串的长度。
* @param args
*/
public static void main(String[] args) {
String str = "sadsfdkfkmfksdmfkdsmflaflkdkmmlkdm";
// 最优解法
lengthOfLongestSubstring2(str);
System.out.println("================================================");
// 暴力解法
lengthOfLongestSubstring(str);
}
// 滑动窗口概念 暴力解法
// 时间复杂度为 O(n*n)
public static int lengthOfLongestSubstring(String s) {
// 记录最长子串
LinkedList<Character> list = new LinkedList<>();
int size = s.length();
// 右指针 index
int ri =0,
//最大子串长度
maxsize =0;
// 遍历字符串
for (int i = 0; i < size; i++) {
if(i !=0 ){
// 左指针向右移动一位
list.removeFirst();
}
// 取出没有重复字符数据的字符串
while((ri < size) && !list.contains(s.charAt(ri))){
list.add(s.charAt(ri)) ;
ri++ ;
}
maxsize = Math.max(maxsize, ri-i);
System.out.println(s.substring(i,ri));
}
System.out.println(maxsize);
return maxsize;
}
// 最优化解法,修改数据逻辑存储结构,通过map形式节省嵌套循环时间开销
// 时间复杂度O(n)
public static int lengthOfLongestSubstring2(String s) {
int n = s.length(), ans = 0;
Map<Character, Integer> map = new HashMap<>();
int lindex = 0;// 左指针
int rindex = 0;// 右指针
for (;rindex < n; rindex++) {
// 向右面移动指针
char curr = s.charAt(rindex);
// 判断map中如果包含当前字符,说明重复,移动左指针到已存在字符位置,并将原来的左指针值替换为右指针 map.put(curr, rindex + 1);
if (map.containsKey(curr)) {
lindex = Math.max(map.get(curr), lindex);
}
// 取出最大不重复子串长度
ans = Math.max(ans, rindex - lindex + 1);
System.out.println(s.substring(lindex,rindex+1));
map.put(curr, rindex + 1);
}
return ans;
}
【无重复字符的最长子串】
最新推荐文章于 2025-06-03 09:50:03 发布