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;

效果如下:
在这里插入图片描述

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