标签:etc 开头 最大 return 重复 sub 缓冲 move bst
要求:给定1个字符串,比如ababc,要求找出“第1个最长的不重复子串”,即:"abc"
思路:遍历每个字符,寻找以它开头的不重复子串,遍历过程中,可以用一个Set作为缓冲区,存放曾经处理过的起始字符串。
过程:
(a)babc -> 子串为a
(ab)abc -> 子串为ab
(ab)abc -> 发现重复字符a,准备从第2个字符开始新一轮查找
a(b)abc -> 子串为b
a(ba)bc -> 子串为ba
a(ba)bc -> 发现重复字符b,准备第第3个字符开始新一轮查找
ab(a)bc -> 子串为a
ab(ab)c -> 子串为ab
ab(abc) -> 查找结束
代码:
/** * 查找最长不重复子串 * * @param s * @return */ public String getFirstLongestSubstring(String s) { System.out.println(s); char[] arr = s.toCharArray(); Set<Character> set = new HashSet<>(); int right = -1, maxLen = -1; String subStr = ""; for (int i = 0; i < arr.length; i++) { if (i > 0) { //缩小左边界 set.remove(arr[i - 1]); } while (right + 1 < arr.length && !set.contains(arr[right + 1])) { set.add(arr[right + 1]); //扩大右边界 right++; } int len = right - i + 1; if (len > maxLen) { maxLen = len; char[] temp = new char[maxLen]; s.getChars(i, right + 1, temp, 0); subStr = new String(temp); } if (maxLen >= arr.length - i) { break; } } return subStr; }
标签:etc 开头 最大 return 重复 sub 缓冲 move bst
原文地址:https://www.cnblogs.com/yjmyzz/p/13195620.html