1. 程式人生 > >LeetCode--longest-substring-without-repeating-characters

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.

分析:求最大無重複字元的子串

思路:用一個map記錄各個字元的下標,首先將所有的下表初始化為-1,然後向後遍歷的過程中記錄當前字元的下標,並將當前字元的下標與上一個相同字元的下標做差值,即可得到它們之間無重複字元的子串。然後用Max記錄更新最大子串數,並更新map儲存的下標值,即從這個重複值重新開始數字符串的數(最大無重複字元子串必定在兩個重複字元之間,或者是整個字串的長度)

這種方法好像被叫做滑動視窗法


"滑動視窗" 
    比方說 abcabccc 當你右邊掃描到abca的時候你得把第一個a刪掉得到bca,
    然後"視窗"繼續向右滑動,每當加到一個新char的時候,左邊檢查有無重複的char,
    然後如果沒有重複的就正常新增,
    有重複的話就左邊扔掉一部分(從最左到重複char這段扔掉),在這個過程中記錄最大視窗長度

其實和上面的思路是一樣的!

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        map<char,int> book;
        int i,Max=0,pre=-1;
        for(i=0;i<s.length();i++) book[s[i]]=-1;
        for(i=0;i<s.length();i++)
        {
            pre=max(pre,book[s[i]]);//更新map中各個字元的下標
            Max=max(Max,i-pre); //儲存暫時的最大無重複子串長度
            book[s[i]]=i; //計算差值後繼續更新
        }
        return Max;
    }
};