饭不食,水不饮,题必须刷
C语言免费动漫教程,和我一起打卡! 《光天化日学C语言》
LeetCode 太难?先看简单题! 《C语言入门100例》
数据结构难?不存在的! 《画解数据结构》
闭关刷 LeetCode,剑指大厂Offer! 《LeetCode 刷题指引》
LeetCode 太简单?算法学起来! 《夜深人静写算法》
给定一个长度为 n ( 1 ≤ n ≤ 1 0 7 ) n (1 \le n \le 10^7) n(1≤n≤107) 的字符串 s s s,求一个最长的满足所有字符不重复的子串的长度。
样例输入:" a b c a b c b b g abcabcbbg abcabcbbg"
样例输出: 3 3 3
class Solution {
public:
int lengthOfLongestSubstring(string s) {
}
};
string
是 C++ 的 STL 中的模板类,可以用来做字符串的各种操作;( 1 ) (1) (1) LeetCode 3. 无重复字符的最长子串
( 2 ) (2) (2) 剑指 Offer II 016. 不含重复字符的最长子字符串
( 3 ) (3) (3) 剑指 Offer 48. 最长不含重复字符的子字符串
class Solution {
int hash[257];
public:
int lengthOfLongestSubstring(string s) {
memset(hash, 0, sizeof(hash));
int maxLen = 0;
int i = 0, j = -1; // (1)
int len = s.length(); // (2)
while(j++ < len - 1) {
++hash[ s[j] ]; // (3)
while(hash[ s[j] ] > 1) { // (4)
--hash[ s[i] ]; // (5)
++i;
}
if(j - i + 1 > maxLen) { // (6)
maxLen = j - i + 1;
}
}
return maxLen;
}
};
s.length()
是无符号整型,当 j == -1
的情况为无符号整型的最大值,永远都无法进入下面的while(j++ < len - 1)
这个循环;无符号整型在进行判断的时候,如果赋值为 -1,就有可能导致变成整数最大值导致逻辑错误;