59 lines
1.3 KiB
Rust
59 lines
1.3 KiB
Rust
fn main() {}
|
|
|
|
fn length_of_longest_substring(s: String) -> i32 {
|
|
if s.is_empty() {
|
|
return 0;
|
|
}
|
|
|
|
let mut char_idx_map = [-1_i64; 128];
|
|
|
|
let mut left: usize = 0;
|
|
let mut right: usize = 1;
|
|
|
|
let mut best = 0;
|
|
|
|
let bytes = s.as_bytes();
|
|
|
|
while right <= s.len() {
|
|
let last_char = bytes[right - 1];
|
|
|
|
let last_seen = char_idx_map[last_char as usize];
|
|
|
|
if last_seen >= left as i64 {
|
|
left = (last_seen + 1) as usize;
|
|
right = right.max(left + 1);
|
|
} else {
|
|
best = best.max(right - left);
|
|
char_idx_map[last_char as usize] = right as i64 - 1;
|
|
right += 1;
|
|
}
|
|
}
|
|
best as _
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::length_of_longest_substring;
|
|
|
|
#[test]
|
|
fn test1() {
|
|
assert_eq!(length_of_longest_substring("abcabcbb".to_string()), 3);
|
|
}
|
|
#[test]
|
|
fn test2() {
|
|
assert_eq!(length_of_longest_substring("bbbbb".to_string()), 1);
|
|
}
|
|
#[test]
|
|
fn test3() {
|
|
assert_eq!(length_of_longest_substring("pwwkew".to_string()), 3);
|
|
}
|
|
#[test]
|
|
fn test4() {
|
|
assert_eq!(length_of_longest_substring("".to_string()), 0);
|
|
}
|
|
#[test]
|
|
fn test5() {
|
|
assert_eq!(length_of_longest_substring("S".to_string()), 1);
|
|
}
|
|
}
|