题目描述:
对于一个字符串,请设计一个高效算法,找到字符串的最长无重复字符的子串长度。
给定一个字符串A及它的长度n,请返回它的最长无重复字符子串长度。保证A中字符全部为小写英文字符,且长度小于等于500。
测试样例:
"aabcb",5
返回:3
哈希表map ---统计了每种字符之前处出现的位置;
变量pre ---代表以是s[i-1]结尾的情况下,该字符上次出现的位置(最长无重复子串的长度);
第一种情况:
出现在位置A的右边;
出现在位置A的左边,此时两者中最长的一个。
代码如下:
class DistinctSubstring {
public:
int longestSubstring(string A, int n) {
// write code here
int map[256]={-1}; //哈希表
int pre = 0; // 当前字符前一个字符上次出现的位置
int len = 0; // 历史最大长度
int cur = 0; // 当前长度
for (int i = 0; i < n; i++)
{
if (map[A[i]] != -1 && pre<=map[A[i]])
pre = a[A[i]];
cur = i - pre + 1; // A[i]的长度
len = max(len, cur);//更新最大长度
map[A[i]] = i+1;//更新哈希表
}
return len;
}
};