LeetCode: 3. 無重複字符的最長子串

最長不重複字符子串

1、題目描述

Given a string, find the length of the longest substring without repeating characters.

Examples:

Given "abcabcbb", the answer is "abc", which the length is 3.

Given "bbbbb", the answer is "b", with the length of 1.

Given "pwwkew", the answer is "wke", with the length of 3. Note that the answer must be a substring, "pwke" is a subsequence and not a substring.

​ 給定一個字符串,找出不含有重複字符的最長子串的長度。

示例:

給定 "abcabcbb" ,沒有重複字符的最長子串是 "abc" ,那麼長度就是3。

給定 "bbbbb" ,最長的子串就是 "b" ,長度是1。

給定 "pwwkew" ,最長子串是 "wke" ,長度是3。請注意答案必須是一個子串"pwke"子序列 而不是子串。

2、解題思路

2.1 窮舉法

​ 雙重循環得到所有的子串,然後判斷每個是不是不重複的,是的話,更新最大不重複子串的值

2.2 滑動窗口法

​ 設計兩個指針,i,j指向字符串的下標;

​ (j-i表示不重複子串的值)

​ 從前向後遍歷,遇到一個字符,判斷這個字符是不是在集合中,如果不在,就將這個字符放到集合中;

​ 如果在,就將第i個字符從集合中刪除,i加一,一直刪除到前一個a爲止

​ 例如下面的字符串:

​ abcad

  • 初始化,i=0,j=0
  • j不斷遞增,當j=3,發現集合中有重複的字符串了,然後開始刪除,將a刪除,然後i指向1
  • 將a放入集合中
  • 不斷地重複操作

2.3 哈希表法

​ 在集合中,我們需要不斷地刪除一個元素,才能夠移動i指針,如果能夠直接找到新的指針,就能夠直接更新i的值,採用key-value的方式,將字符看成key,下標看成value

2.4 緩存表

​ 哈希表的實現較爲複雜,如果已知字符的個數,字符在ASCII表中的位置,創建一張表,存儲當前字符的下標,不斷地更新;

int lengthOfLongestSubstring(char* s) {
    int index[128],i,j;
    int ans = 0;
    for (i=0;i<128;i++){
        index[i] =0 ;
    }
    for(i=0,j=0;s[j];j++){
        i = i > index[s[j]]? i : index[s[j]];
        ans = ans > j-i+1 ? ans : j-i+1;
        index[s[j]] = j + 1;
    }
    return ans;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章