無重復(fù)字符的最長子串

hello占调,大家好暂题,我是腿短快跑,今天的主題是算法究珊,這是我昨天刷的一道算法題薪者。歡迎大家一起溝通有沒有更好的實(shí)現(xiàn)方法

本文最先發(fā)布于我的個(gè)人博客,簡書為同步發(fā)布剿涮,如果有需要請?jiān)L問 腿短快跑的個(gè)人博客

題目描述

給定一個(gè)字符串 s 言津,請你找出其中不含有重復(fù)字符的最長子串的長度。

示例

  • 輸入: s = "abcabcbb"
    輸出: 3
    解釋: 因?yàn)闊o重復(fù)字符的最長子串是 "abc"取试,所以其長度為 3悬槽。

  • 輸入: s = "bbbbb"
    輸出: 1
    解釋: 因?yàn)闊o重復(fù)字符的最長子串是 "b",所以其長度為 1瞬浓。

  • 輸入: s = "pwwkew"
    輸出: 3
    解釋: 因?yàn)闊o重復(fù)字符的最長子串是 "wke"初婆,所以其長度為 3。

請注意,你的答案必須是 子串 的長度磅叛,"pwke" 是一個(gè)子序列屑咳,不是子串。

提示

  • 0 <= s.length <= 5 * 10?
  • s 由英文字母弊琴、數(shù)字兆龙、符號(hào)和空格組成

題解

滑動(dòng)窗口

思路

  1. 左右兩個(gè)指針表示滑動(dòng)窗口的左右邊界
  2. 在每一次判斷中,我們將左指針向右移動(dòng)一個(gè)敲董,表示從下一個(gè)元素開始判斷紫皇,同時(shí)右指針不斷的向后移動(dòng),在此過程中需要保證左右指針中間的字符沒有重復(fù)臣缀,移動(dòng)結(jié)束后記錄左右指針之間的距離坝橡,判斷是否包含重復(fù)字符可以采用哈希表來判斷
  3. 將最長的左右指針之間的距離返回

實(shí)現(xiàn)

class Solution {
    public int lengthOfLongestSubstring(String s) {
        if (s == null || s.length() <= 0) {
            return 0;
        }
        char[] chars = s.toCharArray();
        Set<Character> hash = new HashSet<>();
        int max = 0;
        // i表示左指針,j表示右指針
        for (int i = 0; i < chars.length; i++) {
            hash.clear();
            hash.add(chars[i]);
            for (int j = i + 1; j < chars.length; j++) {
                // 判斷是否存在
                if (hash.contains(chars[j])) {
                    break;
                } else {
                    hash.add(chars[j]);
                }
            }
            if (max < hash.size()) {
                max = hash.size();
            }
        }
        return max;
    }
}

復(fù)雜度分析

時(shí)間復(fù)雜度:O(N^2)精置,因?yàn)槲覀兠看味际菑淖笾羔樜恢瞄_始循環(huán)计寇,最復(fù)雜的情況每次都需要遍歷到結(jié)尾

空間復(fù)雜度:O(N),主要為數(shù)組和哈希表的開銷

性能

執(zhí)行耗時(shí):66 ms脂倦,擊敗了12.53% 的Java用戶
內(nèi)存消耗:41.9 MB番宁,擊敗了12.89% 的Java用戶

滑動(dòng)窗口優(yōu)化

思路

上述方法中,右指針每次都是從左指針的位置開始移動(dòng)赖阻,右指針存在大量的重復(fù)操作蝶押,我們可以從上一次的位置繼續(xù)向后移動(dòng),只需要哈希表數(shù)據(jù)每次在左指針向后移動(dòng)的時(shí)候移除上一次的左指針的元素即可

實(shí)現(xiàn)

class Solution {
    public int lengthOfLongestSubstring(String s) {
        // 哈希集合火欧,記錄每個(gè)字符是否出現(xiàn)過
        Set<Character> occ = new HashSet<Character>();
        int n = s.length();
        // 右指針棋电,初始值為 -1,相當(dāng)于我們在字符串的左邊界的左側(cè)苇侵,還沒有開始移動(dòng)
        int rk = -1, ans = 0;
        for (int i = 0; i < n; ++i) {
            if (i != 0) {
                // 左指針向右移動(dòng)一格赶盔,移除一個(gè)字符
                occ.remove(s.charAt(i - 1));
            }
            while (rk + 1 < n && !occ.contains(s.charAt(rk + 1))) {
                // 不斷地移動(dòng)右指針
                occ.add(s.charAt(rk + 1));
                ++rk;
            }
            // 第 i 到 rk 個(gè)字符是一個(gè)極長的無重復(fù)字符子串
            ans = Math.max(ans, rk - i + 1);
        }
        return ans;
    }
}

復(fù)雜度

時(shí)間復(fù)雜度:O(N),左右指針各會(huì)將每個(gè)字符遍歷一遍

空間復(fù)雜度:O(N)榆浓,主要為哈希表的開銷

性能

執(zhí)行耗時(shí):5 ms于未,擊敗了60.30% 的Java用戶
內(nèi)存消耗:41.2 MB,擊敗了79.66% 的Java用戶

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末陡鹃,一起剝皮案震驚了整個(gè)濱河市烘浦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌萍鲸,老刑警劉巖闷叉,帶你破解...
    沈念sama閱讀 222,729評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異脊阴,居然都是意外死亡握侧,警方通過查閱死者的電腦和手機(jī)捌肴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來藕咏,“玉大人,你說我怎么就攤上這事秽五∧醪椋” “怎么了?”我有些...
    開封第一講書人閱讀 169,461評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵坦喘,是天一觀的道長盲再。 經(jīng)常有香客問我,道長瓣铣,這世上最難降的妖魔是什么答朋? 我笑而不...
    開封第一講書人閱讀 60,135評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮棠笑,結(jié)果婚禮上梦碗,老公的妹妹穿的比我還像新娘。我一直安慰自己蓖救,他們只是感情好洪规,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著循捺,像睡著了一般斩例。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上从橘,一...
    開封第一講書人閱讀 52,736評(píng)論 1 312
  • 那天念赶,我揣著相機(jī)與錄音,去河邊找鬼恰力。 笑死叉谜,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的牺勾。 我是一名探鬼主播正罢,決...
    沈念sama閱讀 41,179評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼驻民!你這毒婦竟也來了翻具?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,124評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤回还,失蹤者是張志新(化名)和其女友劉穎裆泳,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體柠硕,經(jīng)...
    沈念sama閱讀 46,657評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡工禾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評(píng)論 3 342
  • 正文 我和宋清朗相戀三年运提,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片闻葵。...
    茶點(diǎn)故事閱讀 40,872評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡民泵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出槽畔,到底是詐尸還是另有隱情栈妆,我是刑警寧澤,帶...
    沈念sama閱讀 36,533評(píng)論 5 351
  • 正文 年R本政府宣布厢钧,位于F島的核電站鳞尔,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏早直。R本人自食惡果不足惜寥假,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望霞扬。 院中可真熱鬧糕韧,春花似錦、人聲如沸祥得。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽级及。三九已至乒疏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間饮焦,已是汗流浹背怕吴。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評(píng)論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留县踢,地道東北人转绷。 一個(gè)月前我還...
    沈念sama閱讀 49,304評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像硼啤,于是被迫代替她去往敵國和親议经。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評(píng)論 2 361

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