Longest Substring Without Repeating Characters
题目描述
输入一个字符串,输出其中最长的,没有重复字符的子串长度
分析
按照标准的思考思路,应该要分析数据范围(s.length <= 50000),那么就不能用O(n^2)算法,排除遍历左右边界的枚举。考虑O(nlogn)和O(n)。这题看着不像能二分的样子,所以O(n)。
维护左右边界游标l, r,均只能向右移动,若游标中间的子串s[l, r+1]没有重复字符,则r++,否则l++。是否有重复字符则维护一个哈希表。
由于字符数量总共只有256,不是离散的,最简单的哈希表。
代码
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int l, r;
int hash[256] = {0};
int repeat_char;
int max;
l = 0;
r = 0;
repeat_char = 0;
max = 0;
while (r < s.length())
{
if (repeat_char == 0)
{
hash[s[r]]++;
if (hash[s[r]] == 2)
{
repeat_char++;
}
if (repeat_char == 0 and r - l + 1 > max)
{
max = r - l + 1;
}
r++;
}
else
{
hash[s[l]]--;
if (hash[s[l]] == 1)
{
repeat_char--;
}
l++;
}
}
return max;
}
};
思考
这种题大概是比较适合我的题,不会太过于纠结C++语法(指针,高级特性啥的都忘记了)。纯粹的算法题,又没有太多的数据结构算法需要去调。