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;

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

  • 8
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值