代碼測試已過
題目:
給定一個字符串,請你找出其中不含有重複字符的 最長子串 的長度。
示例 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;
效果如下: