话不多说 直接上代码与注释。方法可能不是最好的,但是自己写的,记录一下。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int res = 0; //返回的结果 默认0因为本题可能出现空字串
int index = 0; //用来记录当前无重复子串的长度
int begin = 0; //用来记录当前无重复子串的起始位置
unordered_map<char,int> map; //记录字符上一次出现的位置
//遍历一遍字符串 挨个对比
for(int i = 0; i < s.size(); i++) {
//看这个元素是否出现过,若没有出现,则不存在重复问题,子串长度直接加。
if(map.find(s[i]) == map.end()){
index++;
map.insert(make_pair(s[i],i));
res = res>index?res:index; //更新当前子串长度
}
//若元素出现过,看是否在该子串内,若不在,则可以继续更新子串长度同时更新字符位置
else{
if(begin > map[s[i]]){
index++;
res = res>index?res:index;
}
//若元素出现过,并且在当前子串中,则更新字符位置与子串起始位置,计算新子串长度
else{
begin = map[s[i]] + 1; //更新子串起始位置
index = i - begin + 1; //重新计算子串长度
}
map[s[i]] = i; //更新字符位置
}
}
return res;
}
};
当然这道题同样可以不适用哈希表进行解答,可以使用数组作为哈希表的平替。因为字符在做数组下标时会自动替换为ASCII码表中对应的值,所以可以使用int arry[128]来替代哈希表。