运行结果
执行结果:通过
执行用时 :9 ms, 在所有 java 提交中击败了80.56%的用户
内存消耗 :37.4 MB, 在所有 java 提交中击败了92.70%的用户
代码实现
class Solution {
public int lengthOfLongestSubstring(String s) {
int res = 0;
// 新建hashmap
Map<Character, Integer> map = new HashMap<>();
// 遍历字符串
for (int start = 0, end = 0; end < s.length(); end++)
{
char ch = s.charAt(end); // 读取单个字符
// 如果字符重复
if (map.containsKey(ch))
{
// 将start指向修改为出现重复字符的后一位,max的作用是防止start左移
start = Math.max(map.get(ch), start);
}
// hash表中存储的值为索引+1
map.put(ch, end + 1);
// 计算出现子串的最大长度
res = Math.max(end - start + 1, res);
}
return res;
}
}
做题心得
1.用hash表实现高效的查询,时间复杂度为O(1),hash表的主存储结构是数组,结合链表和红黑树解决哈希冲突问题;
2.采用滑动窗口法,n长度的字符串,只遍历一次,时间复杂度为O(n)。
3.需要注意,当有重复字符出现时,start的指向需要修改为,map中出现相同字符位置的后一位。这点通过存储end + 1,已经实现。
4.start赋值采用max函数,防止start左移。