算法:給定一個字符串,請你找出其中不含有重複字符的最長子串的長度(時間複雜度O(n))

時間複雜度: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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章