描述:給定一個字符串,請找出其中無重複字符的最長子字符串。
樣例
例如,在”abcabcbb”中,其無重複字符的最長子字符串是”abc”,其長度爲 3。
對於,”bbbbb”,其無重複字符的最長子字符串爲”b”,長度爲1。
分析:剛開始其實也找不出思路,後面參考了網上,才理解了。總共字符有256個,可以建立一個大小爲256的數組,用來記錄每個字符出現的位置。字符出現一次,就將其位置傳遞給數組相應的的元素。爲了計算長度,我們還得建立一個變量left來記錄無重複字符串的最左端的位置,然後用當前位置-left+1,即可得到長度。
/*
* @param : a string
* @return: an integer
*/
int lengthOfLongestSubstring(string s) {
// left用以記錄合法的最遠左邊界位置,last記錄字符上一次出現的位置
int ans = 0, left = 0, len = s.length();
int last[255];//用來存放每個字符出現的最新位置信息
memset(last, -1, sizeof last);//將last數組全部元素置爲-1
for (int i = 0; i < len; i++) {
// 上次出現位置在當前記錄邊界之後,即該子串中出現了重複字符,需調整left使得子串合法
if (last[s[i]] >= left) //表明字符串出現了重複字符,s[i]表示每個字符的ASCII碼值
left = last[s[i]] + 1;//更新不重複字符串最左端位置,left存放的即是不重複字符串最左端位置
last[s[i]] = i;//將字符出現的最新的位置存入數組對應的元素
ans = max(ans, i - left + 1);//計算不重複字符串長度
}
return ans;
}