Hi,大家好,这里是炼手Rust专栏,我是xiaoK,今天来看个简单问题:字符串切片。
提问
给定一个字符串,按出现的顺序输出该字符串中长度为 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
- 获取字符串一段子切片
&digits[i..(i+len)],形式上&str[a..b]。 a..b在rust中表示一个区间,左闭右开的区间,a..=b表示左闭右闭的区间。