在Rust中如何构建由指定字符重复n次组成的str?
问题解决与函数修正
首先明确:Rust里无法直接构建独立的str类型,str本质是字符串切片,必须依附于一个拥有所有权的字符串(比如String或者函数输入的&str底层数据)。如果在函数内部创建String后转成&str返回,会因为String在函数结束后被销毁,导致切片悬空,编译器直接报错。
看你的需求,longest_sequence函数要返回原字符串中最长连续字符的切片,不需要重新构建重复字符的字符串——正确思路是在遍历过程中记录最长序列在原字符串中的位置,直接截取原字符串的切片返回,这样才能满足&str的生命周期要求。
原函数存在的问题
- 只记录了最长字符和出现次数,但没记录该序列在原字符串中的位置,无法生成对应切片;
- 初始
current_num设为0虽不影响结果,但逻辑上不够直观(第一个字符本身就是1次)。
修正后的完整函数
pub fn longest_sequence(s: &str) -> Option<&str> { if s.is_empty() { return None; } // 用char_indices遍历,同时获取字符的起始字节索引(处理UTF-8多字节字符) let mut chars = s.char_indices().peekable(); let mut max_start = 0; // 最长序列的起始字节索引 let mut max_char_count = 1; // 最长序列的字符个数 let mut current_start = 0; // 当前序列的起始字节索引 let mut current_char_count = 1; // 当前序列的字符个数 while let Some((idx, ch)) = chars.next() { // 检查下一个字符是否和当前相同 if let Some((_, next_ch)) = chars.peek() { if ch == *next_ch { current_char_count += 1; } else { // 更新最长序列记录 if current_char_count > max_char_count { max_char_count = current_char_count; max_start = current_start; } // 重置当前序列的起始位置和计数 current_start = idx + ch.len_utf8(); current_char_count = 1; } } else { // 处理最后一个字符的收尾,更新最长序列 if current_char_count > max_char_count { max_char_count = current_char_count; max_start = current_start; } } } // 计算最长序列的结束字节索引(遍历找到第max_char_count个字符的结束位置) let mut end = max_start; let mut count = 0; for (idx, ch) in s.char_indices().skip_while(|(i, _)| *i < max_start) { if count >= max_char_count { break; } end = idx + ch.len_utf8(); count += 1; } // 从原字符串截取切片返回 Some(&s[max_start..end]) }
如果你确实需要生成重复字符的字符串
如果你的需求不是截取原字符串切片,而是要生成一个由字符c重复n次的新字符串,可以用迭代器快速实现,返回拥有所有权的String(不能返回&str,原因前面已经说明):
fn repeat_char(c: char, n: usize) -> String { std::iter::repeat(c).take(n).collect() }
内容的提问来源于stack exchange,提问作者Addem
相关产品推荐
相关产品推荐

