字符串算法——最長子串(無重複元素)

問題:給定一個字符串,找出最長的無重複元素的子串
例如:
“bbbbbb”的子串爲”b”
“abcabccd”的子串爲”abc”
兩種思路,一種是從頭開始依次比較,例如:
字符串爲:”abcabccd”,從第一個字符元素”a”開始,直到”abca”發現出現重複元素,則從第二個字符元素”b”開始重複上述操作,比較得到的長度,

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int len =s.length();//字符串長度
        if(len==0)return 0;
        int maxlen = 1;//存儲子串長度
        int i=0;
        while(true){
            boolean flag[] = new boolean[256];//標記是否出現重複元素
            int point = i+1;
            flag [s.charAt(i)]= true;
            while(point<len && !flag[s.charAt(point)]){//判斷該字符元素是否出現過
                flag[s.charAt(point)]=true;
                if(maxlen<point-i+1){//判斷是否找到更大的子串長度
                    maxlen = point-i+1;
                }
                point++;
            }
            i++;
            //判斷是否跳出循環
            if(i>=len){
                break;
            }
        }
            return maxlen;
    }
}

另一種思路是跳躍式比較,例如:
字符串爲”abcbaccd”,一開始從第一個字符元素開始比較,到”abcb”發現出現重複字符元素”b”,這時候不從第二個字符元素”b”開始比較,因爲比較後發現不會比前一個子串更長,這裏從出現重複字符元素前一個該字符元素後一位開始比較,即從第三個字符元素”c”開始,降低時間複雜度。

class Solution {
    public int lengthOfLongestSubstring(String s) {
    int length = s.length();//字符串長度
        if(length ==0){
            return 0;
        }
        int start = 0;
        int i = start;//每次比較的起始位置
        int max = 1;//存儲最長子串長度
        while(i<length){
            boolean flag[] = new boolean[256];//標記是否出現重複字符元素
            for(;i<length;i++){
                if(!flag[s.charAt(i)]){
                    flag[s.charAt(i)] = true;
                    if(max<i-start+1){
                        max = i-start+1;
                    }
                }else{
                    start = s.indexOf(s.charAt(i),start)+1;//下次比較的起始點
                    i=start;
                    break;
                }
            }
        }
        return max;

    }
}
發佈了42 篇原創文章 · 獲贊 2 · 訪問量 8884
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章