题目
请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
解题思路
此题在一个多月之前已经AK过,但是印象中当时做的时候也不是很顺利,思考的比较久。但未想到,今天再次做的时候,居然生生用了两个多小时才通过。而且过程中出错的地方不少,可谓非常坎坷。痛定思痛,决定要把这道题的思路记录下来。
看到这道题最先想到的就是双指针+哈希表,双指针用来计算长度,哈希表目的是记录字符值(key)和其所在的下标(value)。遍历字符串运算过程中,如果当前字符值不存在于哈希表中,则更新长度,如果存在,且存在的字符值在哈希表中对应的下标值大于左指针left(因为left的作用是截断重复的字符串前面的所有值,所以下标小于left的值已经被截断了),则让left指向已经存在的字符值的下一位,且不需要更新长度。最后无论是否存在,都要将当前的字符值和下标存入哈希表。并让right指针右移一位。
Java代码描述
public int lengthOfLongestSubstring1(String s) {
if(s.length() == 0){
return 0;
}
//初始化左右指针
int left = 0;
int right = 1;
int max = 1;
HashMap<Character, Integer> hashMap = new HashMap<>();
hashMap.put(s.charAt(0), 0);
while (right < s.length()) {
//哈希表中存在该值且其下标大于left,也就是说没有被截断
if ((hashMap.containsKey(s.charAt(right))) && (hashMap.get(s.charAt(right)) >=left)) {
left = hashMap.get(s.charAt(right)) + 1;
} else {
max = Math.max(max, right - left + 1);
}
hashMap.put(s.charAt(right), right);
right++;
}
return max;
}
```
发现自己描述的有点不清不楚...全当自我记录了...