給定一個字符串,找出不包含重複字符的最長子串長度。本文提供暴力解法實現,並分析其時間複雜度瓶頸,為優化解法鋪路。
"abcabcbb" → "abc",長度 3"bbbbb" → "b",長度 1"pwwkew" → "wke",長度 3(注意:"pwke" 是子序列非子串)public class Solution {
public int lengthOfLongestSubstring(String s) {
int maxLen = 0;
char[] chars = s.toCharArray();
for (int i = 0; i < chars.length; i++) {
Set seen = new HashSet<>();
int count = 0;
for (int j = i; j < chars.length; j++) {
if (!seen.contains(chars[j])) {
seen.add(chars[j]);
count++;
} else {
break; // 遇重複字符終止內層循環
}
}
maxLen = Math.max(maxLen, count);
}
return maxLen;
}
}
HashSet 存儲字符,m 為字符集大小暴力解法在長字符串下會超時。最優解採用滑動窗口 + HashMap,單次遍歷即可達到 O(n) 時間複雜度,核心思想:
Map 記錄字符最後出現位置進階優化可用定長數組替代 Map(ASCII 128 或擴展 256),進一步降低常數因子。