天天看點

力扣解題:第三題(個人思路整理)

題目

給定一個字元串,請你找出其中不含有重複字元的 最長子串 的長度。

解題思路

一步步拆解、補充,直到完整解題

1.首先想到的是需要循環整個字元串

class Solution {
     int lengthOfLongestSubstring(String s) {
        // 循環整個字元串
        int len = s.length();
        for (int i = 0; i < len; i++) {

        }

        return 0;
    }
}           

2.整個解題的過程大緻是:

1)從最左邊的字元開始與右邊的字元一一比對,發現有重複的字元之後,計算目前子字元串的長度;

2)移動最左邊的字元,重複1)過程,直到字元串的最右邊結束,即循環整個字元串。

技巧:

a)在判斷字元串重複字元的技巧,使用Set

b)移動過程中右指針始終向右移動,不需要循環,如同一個移動的視窗。

c)字元串循環開始時,需要從Set中移除上一個字元串中的字元

步驟:

1)初始化右指針、無重複子字元串長度、Set容器

2)當右指針未到字元串最後邊,并且右指針所指字元不包含在子字元串時,繼續循環操作

3) 計算目前子字元串的長度是否大于上次計算的字元串長度

4)從Set中移除上一個字元串中的字元

代碼

class Solution {
     int lengthOfLongestSubstring(String s) {
        // 1)初始化右指針
        int rk = 0;
        // 1)初始化無重複子字元串長度
        int subLen = 0;
        // 1)初始化Set容器
        Set<Character> subSet = new HashSet<>();
        // 循環整個字元串
        int len = s.length();
        for (int i = 0; i < len; i++) {
            // 4)從Set中移除上一個字元串中的字元
            if (i != 0) {
                subSet.remove(s.charAt(i - 1));
            }
            // 2)當右指針未到字元串最後邊,并且右指針所指字元不包含在子字元串時,繼續循環操作
            while (rk < len && !subSet.contains(s.charAt(rk))) {
                // 将右指針所指字元放入字元Set中
                subSet.add(s.charAt(rk));
                // 右指針向右移動
                rk = rk + 1;
            }
            // 3) 計算目前子字元串的長度是否大于上次計算的字元串長度
            subLen = Math.max(subLen, rk - i);
        }
        return subLen;
    }
}           

繼續閱讀