最長不含重複字串的子字串

2021-09-13 17:51:54 字數 1345 閱讀 1542

一、題目描述

請從字串中找出乙個最長的不包含重複字元的子字串,計算該最長子字串的長度。假設字串中只包含′a′′a′~′z′′z′的字元。例如,在字串"arabcacfr""arabcacfr"中,最長的不含重複字元的子字串是"rabc""rabc"或者"acfr""acfr",長度為4.

二、解題思路

1.採用動態規劃求解 

定義函式f(i)f(i)表示第ii個字元為結尾的不包含重複字元的子字串的最大長度。 

如果第ii個字元在0~(i-1)位置沒有出現過,那麼有f(i)=f(i−1)+1;

如果第ii個字元在之前出現出,且距離它上一次出現的位置有距離d<=f(i−1),那麼可以得到f(i)=d;

如果第ii個字元在之前出現過,且距離它上一次出現的位置有距離d>f(i−1),那麼可以得到f(i)=f(i)+1;

**:

// 最長不含重複字元的子字串

int longestsubstringwithoutduplication(const string& str)

else

dp[i] = dp[i - 1] + 1;

// 存下每個字母本次出現的位置

last_pos[str[i] - 'a'] = i;

maxx = max(maxx, dp[i]);

}return maxx;

}

2、使用點陣圖及快慢指標

使用位圖(不知道位圖可以點這裡)及快慢指標來查詢子串,位圖儲存快慢指標之間的字元。 

使用快慢指標: 

(1)慢指標不動,快指標先走,每走一步,判斷快指標所指字元在位圖中是否已經存在,不存在,儲存字元資訊並繼續走,直到快指標指向重複字串; 

(2)若此時快指標 - 慢指標 > 已經記錄的字串長度,更新字串長度; 

(3)快指標不動,慢指標開始走,每走一步,將位圖中對應的字元資訊刪除,直至快慢指標所指的字元相同(此時快慢指標依舊是錯開的,慢指標指向快指標這個字元出現的第一次,快指標指向的是字元出現第二次),此時不刪除該字元的資訊,慢指標直接加加; 

(4)重複步驟(1)、(2)、(3),直至快指標走到字串尾,當快指標指向尾,再判斷一次步驟2,返回子串串長度。

int lengthoflongestsubstring(char* s) ;//並沒有真的用位圖,只是點陣圖的思想

while (*end != '\0')

else

while (*start != *end)

start++;

}end++;

}if (end - start > count)

return count;

}

最長不含重複字元的子字串

題目 輸入乙個字串,找出字串中最長的不含重複字元的子字串,計算該子字串的長度。假設字串中的字元為 a z 例如 arabcacfr 最長的字串為 rabc 和 acfr 長度為 4 int find max len string str else dp str i a i return max le...

最長不含重複字元的子字串

題目 請從字串中找出乙個最長的不包含重複字元的子 字串,計算該最長子字串的長度。假設字串中只包 含 a z 的字元。例如,在字串 arabcacfr 中,最長的不含重複字元 的子字串是 acfr 長度為 4。分析 f i 表示第i個字元為結尾的不包含重複字元的子字串的最大長度。如果第i個字元之前沒有...

最長不含重複字元的子字串

請從字串中找出乙個最長的不包含重複字元的子字串,計算該最長子字串的長度。假設字串中只包含從 a 到 z 的字元。例如,在字串中 arabcacfr 最長非重複子字串為 acfr 長度為4。暴力,o n o n 分析 維持乙個記憶空間,記錄不重複時的最大長度,然後依次加入新字元,如果加入的字元重複了則...