代码测试已过
题目:
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 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;
效果如下: