BAT面試算法進階(4)- 無重復字符的最長子串(滑動法優(yōu)化+ASCII碼法)

BAT面試算法進階(3)- 無重復字符的最長子串(滑動窗口法)
BAT面試算法進階(2)- 無重復字符的最長子串(暴力法)
BAT面試算法進階(1)--兩數(shù)之和

上一次分享的是滑動窗口解決方法.執(zhí)行的次數(shù)2N個步驟.但是是否還有辦法優(yōu)化了? 答案是肯定的!

一.算法題

  • 題目

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

  • Example
  • 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
  • Note that the answer must be a substring, "pwke" is a subsequence and not a substring.

二.算法題解讀

  • 題目大意:給定一個字符串,找出不含有重復字符的最長子串的長度

  • 解讀Example

  • 給定"abcabcbb",沒有重復字符的最長子串是"abc",那么長度就是3
  • 給定"bbbbb",最長子串就是"b",長度就是1
  • 給定pwwkew,最長子串就是"wke",長度為3,
  • ==注意,==必須是一個子串."pwke",是子序列,而不是子串

三.優(yōu)化"滑動窗口"解決思路

到底如何在滑動窗口方法上優(yōu)化了? 實際上我們可以如果采用進一步優(yōu)化,可以達到只需要N次即可計算成功.我們可以定義字符到索引映射.而不是使用集合來判斷這個字符的存在與否.當遇到重復的字符時,我們即可跳過該滑動窗口.

也可以理解為,如果s[j][i,j)的范圍內有與j'重復的字符.我們不需要逐漸增加i.而是直接跳過[i,j']范圍內的所有元素.并將i變成為j'+1就可以做到.

四.代碼實現(xiàn)

java code

public class Solution {
    public int lengthOfLongestSubstring(String s) {
        int n = s.length(), ans = 0;
       //獲取當前字符索引
        Map<Character, Integer> map = new HashMap<>();         
        //修改[i,j]的范圍       
         for (int j = 0, i = 0; j < n; j++) {
            if (map.containsKey(s.charAt(j))) {
                i = Math.max(map.get(s.charAt(j)), i);
            }
            ans = Math.max(ans, j - i + 1);
            map.put(s.charAt(j), j + 1);
        }
        return ans;
    }
}

五.使用ASCII 128碼 思路

字符串,其實由字符構成.而字符則可以用ASC碼來替代.如此,我們可以用整數(shù)數(shù)組作為直接訪問表來替換Map.

常用表如下:
int [26],用于表示字母 "a" - "z" 或 "A" - "Z";
int [128],用于表示ASCII碼
int [256],用于表示擴展ASCII碼
A = 65, a = 97

ASCII碼.png

六.代碼實現(xiàn)

java code

public class Solution {
    public int lengthOfLongestSubstring(String s) {
        int n = s.length(), ans = 0;
        int[] index = new int[128];         
        for (int j = 0, i = 0; j < n; j++) {
            i = Math.max(index[s.charAt(j)], i);
            ans = Math.max(ans, j - i + 1);
            index[s.charAt(j)] = j + 1;
        }
        return ans;
    }
}

小編OS:

如有疑問,留言即可.胖C會利用空余時間給大家做一個簡單解答的.
持續(xù)更新關注公眾號!

HelloCode 微信公眾號
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • pyspark.sql模塊 模塊上下文 Spark SQL和DataFrames的重要類: pyspark.sql...
    mpro閱讀 9,912評論 0 13
  • 今天晨讀分享的是社交中的三個內容,分別是建立聽眾檔案,抓住對方需求特點;鍛煉身體語言,利用93%特點;引導話題轉向...
    孫黎黎閱讀 338評論 0 1
  • 思處三國已往懷, 風流青史羽扇來。 若問將帥何為路? 一槍一戟沙場哀!
    臨江先生閱讀 253評論 0 2
  • 爸爸媽媽可千萬別因為天使剛生出來還太小,或者天使不會說話,而覺得天使什么都不懂。 天使什么都懂。雖然...
    忠芝閱讀 299評論 0 0

友情鏈接更多精彩內容