[炼手Rust]字符串切片

76 阅读1分钟

Hi,大家好,这里是炼手Rust专栏,我是xiaoK,今天来看个简单问题:字符串切片。

bread.jpeg

提问

给定一个字符串,按出现的顺序输出该字符串中长度为 n 的所有连续子串。如果从长度为 5 位字符串中请求 6 位子序列,那么返回空列表。

例:
input:"49142",3
output:["491","914","142"]

input:"49142",4
output:["4914","9142"]

模板:

pub fn series(digits: &str, len: usize) -> Vec<String> { }

分析

假设字符串长度为 L ,那么要去长度为 n 的所有子序列,只需要从 0 开始直到 L-n ,每次取长度为 n 的子字符串即可。
例如上面第一个例子,字符串 "49142" 长度为 5 ,我们从 0 开始,一直到 5-3 ,每次取长度为 3 的子字符串即可。

解决方案

pub fn series(digits: &str, len: usize) -> Vec<String> {
    let mut windows = vec![];
    if len <= digits.len() {
        let times = digits.len() - len;
        for i in 0..=times {
            windows.push((&digits[i..(i+len)]).to_string());
        }
    }
    windows
}

Trick

  1. 获取字符串一段子切片&digits[i..(i+len)],形式上&str[a..b]
  2. a..brust中表示一个区间,左闭右开的区间,a..=b表示左闭右闭的区间。