給定一個(gè)字符串,請(qǐng)你找出其中不含有重復(fù)字符的?最長(zhǎng)子串?的長(zhǎng)度。
示例?1:
輸入: "abcabcbb"
輸出: 3
解釋: 因?yàn)闊o(wú)重復(fù)字符的最長(zhǎng)子串是 "abc",所以其長(zhǎng)度為 3。
示例 2:
輸入: "bbbbb"
輸出: 1
解釋: 因?yàn)闊o(wú)重復(fù)字符的最長(zhǎng)子串是 "b",所以其長(zhǎng)度為 1。
示例 3:
輸入: "pwwkew"
輸出: 3
解釋: 因?yàn)闊o(wú)重復(fù)字符的最長(zhǎng)子串是?"wke",所以其長(zhǎng)度為 3。
?? ? 請(qǐng)注意,你的答案必須是 子串 的長(zhǎng)度,"pwke"?是一個(gè)子序列,不是子串。
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的增加步長(zhǎng)?*/
????????????}
????????}
????????if?(max?==?95)?{?/*?這個(gè)條件優(yōu)化最明顯?*/
????????????return?95;
????????}?else?if?(count?>?max)?{
????????????max?=?count;
????????}
????????/*?off不是遇見(jiàn)已存在的字符退出的,說(shuō)明結(jié)束了?*/
????????if?(temp[*off]?==?0)?{
????????????return?max;
????????}
????????p?+=?temp[*off];
????}
????return?max;
}
temp數(shù)組的下標(biāo)不使用temp[*off - 0]的方式,采用編譯器的類(lèi)型轉(zhuǎn)換。
ASCII碼中非控制類(lèi)可見(jiàn)字符就95個(gè),達(dá)到這個(gè)數(shù)據(jù)直接return,減少耗時(shí)最多。
p增加的步長(zhǎng)就是官方分析,不要加一的方式,采用跳步,直接跳到數(shù)組中重復(fù)字符的下一個(gè)位置,巧妙使用計(jì)數(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/
來(lái)源:力扣(LeetCode)
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。