LeetCode:3. 無重復(fù)字符的最長子串

難度:中等
給定一個(gè)字符串堰怨,請你找出其中不含有重復(fù)字符的 最長子串 的長度遥昧。

示例 1:
輸入: "abcabcbb"
輸出: 3
解釋: 因?yàn)闊o重復(fù)字符的最長子串是 "abc",所以其長度為 3。

示例 2:
輸入: "bbbbb"
輸出: 1
解釋: 因?yàn)闊o重復(fù)字符的最長子串是 "b"俭缓,所以其長度為 1刑赶。

示例 3:
輸入: "pwwkew"
輸出: 3
解釋: 因?yàn)闊o重復(fù)字符的最長子串是 "wke"捏浊,所以其長度為 3。
請注意撞叨,你的答案必須是 子串 的長度金踪,"pwke" 是一個(gè)子序列,不是子串牵敷。

第一種解答:
思路:
使用一個(gè)長度為 128 的 boolean 數(shù)組 flag 充當(dāng)散列表用來記錄子串的字符(利用到字符的 ascii 碼作為數(shù)組的下標(biāo))胡岔,初始化都為false。遍歷整個(gè)字符串枷餐,外循環(huán)控制子串的起始靶瘸,內(nèi)循環(huán)控制子串的長度,每遇到一個(gè)字符就檢查 flag 中是否存在該元素,不存在則將 flag[]設(shè)置為 true怨咪,存在則結(jié)束內(nèi)循環(huán)屋剑。

class Solution {
    public int lengthOfLongestSubstring(String s) {
        boolean[] flag = new boolean[128]; // 問題1
        int  sublen = 0;
        for(int i = 0; i < s.length(); i ++){
            // 將 flag 初始化為 false
            for(int k = 0; k < flag.length; k++)
                flag[k] = false;
            // 子串的起始
            flag[(int)(s.charAt(i))] = true;
            int len = 1;
            for(int j = i+1; j < s.length(); j ++){
              // flag 中存在相同字符的情況  
              if(flag[(int)(s.charAt(j))])
                    break;
               // flag不存在相同字符的情況
               len ++;
               flag[(int)(s.charAt(j))] = true;
            }
            if(sublen < len){
                sublen = len;
            }
        }
        return sublen;
    }

}

也可將 boolean 數(shù)組換成 int 數(shù)組,數(shù)組記錄的是元素所在的下標(biāo)诗眨。

class Solution {
    public int lengthOfLongestSubstring(String s) {
        if(s.equals("")) return 0;

        int[] flag = new int[128];
        int sublen = 0 ,len;
        for(int i = 0; i < s.length(); i ++ ){
            
            // 初始化 flag;
            for(int k = 0; k < flag.length; k++)
                flag[k] = -1;

            flag[s.charAt(i)] = i;
            len = 1;
            for(int j = i + 1; j < s.length(); j ++){
                if(flag[s.charAt(j)] != -1){
                    i = flag[s.charAt(j)];
                    break;
                }
                len ++;
                flag[s.charAt(j)] = j;
            }
            sublen = len > sublen ? len: sublen;
        }
        return sublen;
    }
}

參考評論區(qū)的第二種解答
第二種解答:
使用雙指針 left, right維護(hù)一個(gè)無重復(fù)字符區(qū)間(leftright 之間的字符無重復(fù))唉匾,right 指針每移動(dòng)到一位,就循環(huán)檢測 [left , right) 無重復(fù)字符區(qū)間是否存在與 right指向的字符相同的字符匠楚,如果存在就更新 left 指針巍膘,將 left移動(dòng)到區(qū)間中與right指向相同字符的下一個(gè)位置,繼續(xù)維護(hù)一個(gè)無重復(fù)的字符區(qū)間芋簿,同時(shí)更新最長子串的長度max峡懈。不存在則更新最長子串的長度max,同時(shí)繼續(xù)將 right 往下移動(dòng)益咬。

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int max = 0, left = 0, right = 0; 
        if(s.length() == 1)
            max = 1;
        else if( !s.equals("") ){
            //char[] str = s.toCharArray();
            for(right = 1; right < s.length(); right ++){     
                for(int i = left; i < right; i ++){
                    if(s.charAt(i) == s.charAt(right)){
                        // 更新 max 
                        max = right - left > max ? right - left : max;
                        left = i + 1;
                        break;
                    }
                }
                // 更新 max
                max = right- left + 1 > max ? right - left + 1: max;
            }
        }
        return max;
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末逮诲,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子幽告,更是在濱河造成了極大的恐慌梅鹦,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件冗锁,死亡現(xiàn)場離奇詭異齐唆,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)冻河,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進(jìn)店門箍邮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人叨叙,你說我怎么就攤上這事锭弊。” “怎么了擂错?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵味滞,是天一觀的道長。 經(jīng)常有香客問我钮呀,道長剑鞍,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任爽醋,我火速辦了婚禮蚁署,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蚂四。我一直安慰自己光戈,他們只是感情好哪痰,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著久妆,像睡著了一般妒御。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上镇饺,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天,我揣著相機(jī)與錄音送讲,去河邊找鬼奸笤。 笑死,一個(gè)胖子當(dāng)著我的面吹牛哼鬓,可吹牛的內(nèi)容都是我干的监右。 我是一名探鬼主播,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼异希,長吁一口氣:“原來是場噩夢啊……” “哼健盒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起称簿,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤扣癣,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后憨降,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體父虑,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年授药,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了士嚎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,110評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡悔叽,死狀恐怖莱衩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情娇澎,我是刑警寧澤笨蚁,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站九火,受9級特大地震影響赚窃,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜岔激,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一勒极、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧虑鼎,春花似錦辱匿、人聲如沸键痛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽絮短。三九已至,卻和暖如春昨忆,著一層夾襖步出監(jiān)牢的瞬間丁频,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工邑贴, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留席里,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓拢驾,卻偏偏與公主長得像奖磁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子繁疤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評論 2 355

推薦閱讀更多精彩內(nèi)容