重点(滑动窗口):
保证窗口内的元素均满足条件,重复字符,更新 left
到上一个重复字符的下一个位置
思路:
代码(rust:
(1)只需要更新 left
到上一个重复字符的下一个位置(index + 1),这样可以保证 left
到 right
之间的子字符串是无重复字符的(不可能有两个重复字符)
(2)字符串转换为字符向量,便于后续索引操作。
let chars: Vec<char> = s.chars().collect();
(3)统一索引类型:
let mut map_: HashMap<char, usize> = HashMap::new();
使用 usize
作为哈希表的值类型,以匹配 right
和 left
的类型。
use std::collections::HashMap;
use core::cmp::max;
impl Solution {
pub fn length_of_longest_substring(s: String) -> i32 {
let mut map_: HashMap<char, usize> = HashMap::new();
let mut ans = 0;
let mut left = 0;
let chars: Vec<char> = s.chars().collect();
for right in 0..chars.len() {
let ch = chars[right];
if let Some(&index) = map_.get(&ch) {
left = max(left, index + 1);
}
map_.insert(ch, right);
ans = max(ans, right - left + 1);
}
ans as i32
}
}