時間複雜度:O(2n) = O(n)O(2n)=O(n),在最糟糕的情況下,每個字符將被 startIdx 和 endIdx 訪問兩次
示例 1:
輸入: "abcabcbb"
輸出: 3
解釋: 因爲無重複字符的最長子串是 "abc",所以其長度爲 3。
示例 2:
輸入: "bbbbb"
輸出: 1
解釋: 因爲無重複字符的最長子串是 "b",所以其長度爲 1。
示例 3:
輸入: "pwwkew"
輸出: 3
解釋: 因爲無重複字符的最長子串是 "wke",所以其長度爲 3。
請注意,你的答案必須是 子串 的長度,"pwke" 是一個子序列,不是子串。
下面有註解版和無註解版
無註釋版:
public static void longestSubString(String str) {
int startIdx = 0;//開始索引
int endIdx = 0; //結束索引
int longest = 0;//最大長度
int strLength = str.length();
HashSet<Character> hashSet = new HashSet<>();
StringBuilder longestSubStr = new StringBuilder();
String maxString = "";
while (startIdx < strLength && endIdx < strLength) {
if (!hashSet.contains(str.charAt(endIdx))) {//asdasdfasdfgh
longestSubStr.append(str.charAt(endIdx));
hashSet.add(str.charAt(endIdx++));
longest = Math.max(longest, endIdx - startIdx);
if (maxString.length() < longestSubStr.length()) {
maxString = longestSubStr.toString();
}
} else {
hashSet.remove(str.charAt(startIdx++));
longestSubStr.delete(0, 1);
}
}
System.out.println("【"+str+"】最大長度:"+longest +",最長字符串:"+maxString);
}
註釋版:
public static void longestSubString(String str) {
int startIdx = 0;//開始索引
int endIdx = 0; //結束索引
int longest = 0;//最大長度
//當前字符串長度
int strLength = str.length();
//無重複集合 判斷元素是否存在
HashSet<Character> hashSet = new HashSet<>();
//記錄無重複字符串
StringBuilder longestSubStr = new StringBuilder();
//記錄最大無重複字符串
String maxString = "";
while (startIdx < strLength && endIdx < strLength) {
if (!hashSet.contains(str.charAt(endIdx))) {//asdasdfasdfgh
longestSubStr.append(str.charAt(endIdx));
//元素不存在加入集合,結束索引向後移動一位
hashSet.add(str.charAt(endIdx++));
//計算出當前不重複字符串最大長度
longest = Math.max(longest, endIdx - startIdx);
if (maxString.length() < longestSubStr.length()) {
maxString = longestSubStr.toString();
}
} else {
//元素存在,刪除開始索引的值,開始索引向後移動一位
hashSet.remove(str.charAt(startIdx++));
longestSubStr.delete(0, 1);
}
}
System.out.println("【"+str+"】最大長度:"+longest +",最長字符串:"+maxString);
}
測試:
public static void main(String[] args) {
longestSubString("abcabcbb");
longestSubString("bbbbb");
longestSubString("pwwkew");
longestSubString("asdasdfasd");
longestSubString("asdasdfasdfgh");
}
console:
【abcabcbb】最大長度:3,最長字符串:abc
【bbbbb】最大長度:1,最長字符串:b
【pwwkew】最大長度:3,最長字符串:wke
【asdasdfasd】最大長度:4,最長字符串:asdf
【asdasdfasdfgh】最大長度:6,最長字符串:asdfgh