LeetCode:longest-substring-without-repeating-characters

題目描述:

Given a string, find the length of the longest substring without repeating characters. 
For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the length is 3. 
For "bbbbb" the longest substring is "b", with the length of 1.

給定一個字符串,找到不重複的最長子字符串的長度。 例如,“abcabcbb”的不含重複字符的最長子字符串是“abc”,其長度爲3.對於“bbbbb”,無重複字符的最長的子字符串是“b”,長度爲1。

注意:子串是連續的。

題目解析:

"滑動窗口":例如abcabccc,

  • 當從左向右掃描到abca的時候,得把第一個a刪掉得到bca,然後"窗口"繼續向右滑動,
  • 每當加入一個新char的時候,左邊部分檢查有無重複的char,然後如果沒有重複的就正常添加,有重複的話就左邊扔掉一部分(從最左到重複char這段扔掉),
  • 在這個過程中記錄最大窗口長度。
import java.util.HashMap;
public class Solution {
    public int lengthOfLongestSubstring(String s) {
        if(s == null || s.length() < 1) {
            return 0;
        }
        //HashMap<字符,下標>
        HashMap<Character,Integer> map = new HashMap<Character,Integer>();
        int windowBegin = 0;
        int windowMax = 0;
        for(int i=0; i<s.length();i++){
            char  c = s.charAt(i);
            //窗口左邊可能爲下一個char,或者不變
            windowBegin = Math.max(windowBegin,(map.containsKey(c))? map.get(c)+1:0);
            windowMax = Math.max(windowMax, i-windowBegin+1);//當前窗口長度
            map.put(c,i);
        }
        return windowMax;
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章