Challenge 40

Rust Challenge: Longest substring without repeating characters

Write a function longest_unique_substring that takes a string as input and returns the longest substring that does not contain any repeated characters.


pub fn longest_unique_substring(s: &str) -> String {
    // your implementation goes here
    // don't touch the code in the main function below
}

fn main() {
    // Test 1: Empty string
    let result1 = longest_unique_substring("");
    if result1 != "" {
        panic!("Test 1 failed: Expected \"\", got {:?}", result1);
    }
    println!("Test 1 passed: longest_unique_substring(\"\") = {:?}", result1);

    // Test 2: All unique characters
    let result2 = longest_unique_substring("abcdefg");
    if result2 != "abcdefg" {
        panic!("Test 2 failed: Expected \"abcdefg\", got {:?}", result2);
    }
    println!("Test 2 passed: longest_unique_substring(\"abcdefg\") = {:?}", result2);

    // Test 3: String with duplicates
    let result3 = longest_unique_substring("aabbcc");
    if result3 != "ab" {
        panic!("Test 3 failed: Expected \"ab\", got {:?}", result3);
    }
    println!("Test 3 passed: longest_unique_substring(\"aabbcc\") = {:?}", result3);

    // Test 4: Single character
    let result4 = longest_unique_substring("a");
    if result4 != "a" {
        panic!("Test 4 failed: Expected \"a\", got {:?}", result4);
    }
    println!("Test 4 passed: longest_unique_substring(\"a\") = {:?}", result4);

    // Test 5: Mixed case
    let result5 = longest_unique_substring("abcABCabc");
    if result5 != "abcABC" {
        panic!("Test 5 failed: Expected \"abcABC\", got {:?}", result5);
    }
    println!("Test 5 passed: longest_unique_substring(\"abcABCabc\") = {:?}", result5);

    // Test 6: Multiple spaces
    let result6 = longest_unique_substring("abc abc abc");
    if result6 != "abc " {
        panic!("Test 6 failed: Expected \"abc \", got {:?}", result6);
    }
    println!("Test 6 passed: longest_unique_substring(\"abc abc abc\") = {:?}", result6);

    // Test 7: Large string with no duplicates
    let long_str1 = "abcdefghijklmnopqrstuvwxyz";
    let result7 = longest_unique_substring(long_str1);
    if result7 != long_str1 {
        panic!("Test 7 failed: Expected \"{}\", got {:?}", long_str1, result7);
    }
    println!("Test 7 passed: longest_unique_substring(\"long unique string\") = {:?}", result7);

    // Test 8: Large string with duplicates
    let long_str2 = "abcabcabc".repeat(100);
    let result8 = longest_unique_substring(&long_str2);
    if result8 != "abc" {
        panic!("Test 8 failed: Expected \"abc\", got {:?}", result8);
    }
    println!("Test 8 passed: longest_unique_substring(\"large duplicated string\") = {:?}", result8);
}

Solution

Click to Show/Hide Solution
#![allow(unused)]
fn main() {
pub fn longest_unique_substring(s: &str) -> String {
    let mut start = 0;
    let mut max_len = 0;
    let mut max_start = 0;
    let mut seen = std::collections::HashMap::new();
    let chars: Vec<char> = s.chars().collect();

    for (end, &c) in chars.iter().enumerate() {
        if let Some(&prev) = seen.get(&c) {
            start = start.max(prev + 1);
        }
        seen.insert(c, end);
        let current_len = end - start + 1;
        if current_len > max_len {
            max_len = current_len;
            max_start = start;
        }
    }

    chars[max_start..max_start + max_len].iter().collect()
}
}