3.無重複字符的最長子串
給定一個字符串,請你找出其中不含有重複字符的 最長子串 的長度。
示例 1:
輸入: "abcabcbb"
輸出: 3
解釋: 因爲無重複字符的最長子串是 "abc",所以其長度爲 3。
示例 2:
輸入: "bbbbb"
輸出: 1
解釋: 因爲無重複字符的最長子串是 "b",所以其長度爲 1。
示例 3:
輸入: "pwwkew"
輸出: 3
解釋: 因爲無重複字符的最長子串是 "wke",所以其長度爲 3。
請注意,你的答案必須是 子串 的長度,“pwke” 是一個子序列,不是子串。
題目解法
首先思考,本題如果沒有重複字符,那麼皆大歡喜,直接輸出字符串長度即可。問題就出現在了重複的字符串身上。我們所要考慮的就是,當出現重複字符時,我們讓哪一個字符“存在”於我們的子串中,能夠讓字串長度最大。
因此,我們只需要維護頭尾兩個指針,指向可能的最長子串的頭尾。每次移動指針都判斷一下當前長度有沒有超過已知的最長長度,超過了則更新最長長度。
具體更新方法:用hash表存儲當前子串中出現的字符,尾節點遍歷字符串,判斷尾節點字符是否出現過。如果出現了,則將頭結點移動到尾節點字符在子串出現位置的後一個,並且消除hash表中由於移動頭結點而不復存在於子串中的字符記錄。
代碼
本題採用c++
class Solution {
public:
int lengthOfLongestSubstring(string s) {
bool hashmap[256];
for(int i = 0; i < 256;i++)
{
hashmap[i] = 0;
}
int tail = 0,head = 0;
int max_len = -1;
for(tail = 0; tail < s.length();tail++)
{
if(tail - head + 1 > max_len)
{
max_len = tail - head;
}
if(hashmap[int(s[tail])])
{
while(s[head] != s[tail])
{
hashmap[int(s[head])] = 0;
head++;
}
head++;
}
hashmap[int(s[tail])] = 1;
}
if(tail - head > max_len)
{
max_len = tail - head;
}
return max_len;
}
};