题目描述
Given a string, find the length of the longest substring without repeating characters.
简单来说就是找到字符串中最短的子串
拿到题目第一感觉就是遍历所有子串,然后求出最大长度。但这种方法不用想就知道时间复杂度非常高。不适合做这道题。然后去网上找了一些资料,在根据自己的理解来相处了一种还行的方法。 废话少说,上代码
int lengthOfLongestSubstring(string s) {
int index[128] = {0};
int max = 0;
int j = 0;
for (int i = 0; i < s.size(); ++i) {
if(index[s[i]] && index[s[i]] > j) {
j = index[s[i]];
}
if (max < i - j + 1) {
max = i - j + 1;
}
index[s[i]] = i + 1;
}
return max > current_length ? max : current_length;
}
这代码很多地方都是比较好理解的,数组index
是用来记录字符的下标。max
是最大子串的长度。主要就是给j
赋值那一段代码。这里稍微解释一下:
首先
i - j + 1
是用来计算子串的长度的。所以我们必须保证s[j, i]
中没有重复的元素。所以当index[s[i]]>0
时,说明在s[j, i]
中存在相同字符,即s[i]
, 所以我们必须将j移动到s[i]上一次出现的下标,即index[s[i]]
, 所以j = index[s[i]]