Hone logo
Hone
Problems

Safe String Manipulation with Rust's Ownership System

Rust is renowned for its strong memory safety guarantees without a garbage collector, achieved through its ownership system. This challenge will test your understanding of these concepts by requiring you to safely manage string data in a way that prevents common memory-related bugs like dangling pointers or data races. You'll implement functions that manipulate string slices, demonstrating how Rust's compiler enforces memory safety.

Problem Description

You are tasked with creating a set of Rust functions that operate on strings. The primary goal is to ensure these functions are memory-safe, adhering to Rust's ownership and borrowing rules. You'll be working with string slices (&str) and potentially owned String types.

Key Requirements:

  1. No unsafe code: All solutions must be implemented using safe Rust.
  2. Correctness: The functions should produce the expected output for valid inputs.
  3. Memory Safety: The compiler should not issue any warnings or errors related to memory safety (e.g., use-after-free, double-free, data races). This implies careful management of lifetimes and borrowing.
  4. Function Signatures: You will be provided with specific function signatures to implement. You must adhere to these signatures.

Expected Behavior:

  • Functions should either return new String values or modify mutable references as specified by their signatures, without violating memory safety.
  • The lifetime of any borrowed data must be correctly managed.

Edge Cases to Consider:

  • Empty strings.
  • Strings with special characters or Unicode.
  • Potentially very long strings (though performance constraints are moderate).

Examples

Example 1: Concatenating Strings

Input:

let s1 = String::from("Hello");
let s2 = String::from(" ");
let s3 = String::from("World!");

Function Signature to Implement:

fn concatenate_strings(s1: &str, s2: &str, s3: &str) -> String

Expected Output:

"Hello World!"

Explanation:

The concatenate_strings function takes three string slices and returns a new String that is the concatenation of the three. Rust's format! macro or String::push_str can be used here.

Example 2: Finding the Longest Word

Input:

let sentence = "The quick brown fox jumps over the lazy dog";

Function Signature to Implement:

fn find_longest_word(sentence: &str) -> &str

Expected Output:

"jumps"

Explanation:

The find_longest_word function takes a string slice representing a sentence and returns a string slice pointing to the longest word within that sentence. You'll need to split the sentence by whitespace and compare lengths. The returned slice's lifetime will be tied to the input sentence.

Example 3: Reversing a String Slice

Input:

let text = "rustacean";

Function Signature to Implement:

fn reverse_string_slice(s: &str) -> String

Expected Output:

"naecatsur"

Explanation:

The reverse_string_slice function takes a string slice and returns a new String containing the reversed characters of the input slice. Direct manipulation of &str to reverse in-place is not possible without creating a new String. This tests handling character iteration and string building.

Constraints

  • No unsafe blocks: You are forbidden from using the unsafe keyword in your solutions.
  • Standard Library Use: You are encouraged to use the Rust standard library.
  • Performance: While correctness and memory safety are paramount, extremely inefficient solutions (e.g., O(n^3) for operations that can be O(n)) should be avoided if a reasonably efficient safe alternative exists.

Notes

  • Pay close attention to the lifetimes of borrowed data. The Rust compiler will be your primary guide in ensuring memory safety.
  • Consider the difference between String (owned, growable string) and &str (immutable string slice).
  • For tasks involving iteration and modification, think about whether you need to collect results into a new String or if modifying a mutable reference is appropriate (and safe).
  • The chars() and rev() methods on iterators can be very useful.
Loading editor...
rust