3. 無重複字符的最長子串(C++)---哈希查找

題目詳情

給定一個字符串,請你找出其中不含有重複字符的 最長子串 的長度。

示例 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+1

2. 當遍歷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;
    }
};


結果

 


 

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章