題目詳情
給定一個字符串,請你找出其中不含有重複字符的 最長子串 的長度。
示例 1:
輸入: "abcabcbb"
輸出: 3
解釋: 因爲無重複字符的最長子串是 "abc",所以其
長度爲 3。
示例 2:
輸入: "bbbbb"
輸出: 1
解釋: 因爲無重複字符的最長子串是 "b"
,所以其長度爲 1。
示例 3:
輸入: "pwwkew"
輸出: 3
解釋: 因爲無重複字符的最長子串是 "wke",所以其長度爲 3。
請注意,你的答案必須是 子串 的長度,"pwke" 是一個子序列,不是子串。
——題目難度: 中等
利用數組實現哈希查找的思路
1. m[256]數組存儲的是 以s串中出現過的字符爲下標,值爲當前字符所在串中的位置(從0開始)+1
如:s="abc",則m['a']=0+1,m['b']=1+1,m['c']=2+12. 當遍歷s串時,當m[s[i]] != 0(也就是s[i]不是第一次出現) 且 m[s[i]] >= left(1.說到m[s[i]]代表的是該字符在s串中的位置+1,則此時代表上一次的s[i]字符在[left,i]內,這種情況就更新邊界left的值即可
3.遍歷s串時,只要不是2.的情況就查看此時的mlen是否大於上次的mlen,如果是則更新mlen的值
4.每次都需要將遍歷到的字符s[i]進行位置存儲(也就是m[s[i]] = i + 1)
-瞭解了思路,下面代碼
//利用數組進行哈希查找
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int m[256]={0}, left = 0, len = s.length(), mlen = 0; //mlen表示maxlength
for(int i=0;i<len;i++)
{
if( m[s[i]] && m[s[i]] >= left) { //需要更新left
left = m[s[i]];
}else{
mlen = (i-left+1)>mlen? (i-left+1):mlen;
}
m[s[i]] = i + 1;
}
return mlen;
}
};
結果