LeetCode算法 —— 無重複字符的最長子串

代碼測試已過

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

示例 1:
輸入: “abcabcbb”
輸出: 3
解釋: 因爲無重複字符的最長子串是 “abc”,所以其長度爲 3。

示例 2:
輸入: “bbbbb”
輸出: 1
解釋: 因爲無重複字符的最長子串是 “b”,所以其長度爲 1。

示例 3:
輸入: “pwwkew”
輸出: 3
解釋: 因爲無重複字符的最長子串是 “wke”,所以其長度爲 3。

請注意,你的答案必須是 子串 的長度,“pwke” 是一個子序列,不是子串。

.

隊列思想:將字符依次放入隊列之中,當前準備放入隊列中的字符 與 隊列中的每一個字符進行判斷
如若相同,則改變隊列頭的索引位置

代碼如下:

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
	if (s == "")		// 空 直接返回
	    return 0;
        
        int s_index(0);          // 用於索引 s
        int count(0);          // 最長無重複子串的長度
    
        // + 50  多開闢點內存,防止不夠
        int* queArr(new int[s.length() + 50]);     // 隊列思想
        int head(0);
        int tail(0);
    
        queArr[head] = s[s_index++];      // 將第一個字符放入隊列之中
        ++tail;            // 指向尾部
        ++count;           // 初始最大無重複子串長度爲 1
  
        while (head < tail && tail < s.length() && s_index < s.length()) 		
        {
   	    int flag(0);

   	    // 遍歷隊列中的元素 判斷是否相等
   	    for (size_t i = head; i < tail; i++)   
   	    {
    	        if (queArr[i] == s[s_index])
    	        {
     		    queArr[tail++] = s[s_index++];
     		    head = i + 1;       // 核心部分
     		
     		    flag = 1;
     		    break;
    	        } 
            }
    
            if (flag) continue;
    
            queArr[tail++] = s[s_index++];     // 沒有重複 入隊 
            count = max(count, tail - head);    // 計算當前子串的大小
        }
    
        return count;
    }
};

測試代碼:

cout << (new Solution())->lengthOfLongestSubstring("abcabcbb") << endl;

cout << (new Solution())->lengthOfLongestSubstring("bbbbb") << endl;

cout << (new Solution())->lengthOfLongestSubstring("pwwkew") << endl;

效果如下:
在這裏插入圖片描述

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