給定一個字符串,請你找出其中不含有重復(fù)字符的?最長子串?的長度牺陶。
示例?1:
輸入: "abcabcbb"
輸出: 3
解釋: 因為無重復(fù)字符的最長子串是 "abc"伟阔,所以其長度為 3。
示例 2:
輸入: "bbbbb"
輸出: 1
解釋: 因為無重復(fù)字符的最長子串是 "b"掰伸,所以其長度為 1皱炉。
示例 3:
輸入: "pwwkew"
輸出: 3
解釋: 因為無重復(fù)字符的最長子串是?"wke",所以其長度為 3狮鸭。
?? ? 請注意合搅,你的答案必須是 子串 的長度多搀,"pwke"?是一個子序列,不是子串灾部。
int?lengthOfLongestSubstring(char?*s){
????char?*p;
????char?*off;
????int?len?=?strlen(s);
????int?max?=?-1;
????if?(len?<=?1)?{?/*?入?yún)z查?*/
????????return?len;
????}
????for?(p?=?s;?p?<?s?+?len;)?{
????????int?temp[127]?=?{0};
????????int?count?=?1;
????????temp[*p]?=?count;
????????for?(off?=?p?+?1;?off?<?s?+?len;?off++)?{
????????????if?(temp[*off]?!=?0)?{
????????????????break;
????????????}?else?{
????????????????temp[*off]?=?count++;?/*?里面保存下一次p的增加步長?*/
????????????}
????????}
????????if?(max?==?95)?{?/*?這個條件優(yōu)化最明顯?*/
????????????return?95;
????????}?else?if?(count?>?max)?{
????????????max?=?count;
????????}
????????/*?off不是遇見已存在的字符退出的康铭,說明結(jié)束了?*/
????????if?(temp[*off]?==?0)?{
????????????return?max;
????????}
????????p?+=?temp[*off];
????}
????return?max;
}
temp數(shù)組的下標(biāo)不使用temp[*off - 0]的方式,采用編譯器的類型轉(zhuǎn)換赌髓。
ASCII碼中非控制類可見字符就95個从藤,達(dá)到這個數(shù)據(jù)直接return,減少耗時最多锁蠕。
p增加的步長就是官方分析夷野,不要加一的方式,采用跳步荣倾,直接跳到數(shù)組中重復(fù)字符的下一個位置悯搔,巧妙使用計數(shù)
作者:wang-yong-hao
鏈接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/solution/cma-suo-jian-hao-shi-shi-jian-fang-fa-by-wang-yong/
來源:力扣(LeetCode)
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán)逃呼,非商業(yè)轉(zhuǎn)載請注明出處鳖孤。