You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Rust中如何构建由指定字符重复n次组成的str?

问题解决与函数修正

首先明确:Rust里无法直接构建独立的str类型,str本质是字符串切片,必须依附于一个拥有所有权的字符串(比如String或者函数输入的&str底层数据)。如果在函数内部创建String后转成&str返回,会因为String在函数结束后被销毁,导致切片悬空,编译器直接报错。

看你的需求,longest_sequence函数要返回原字符串中最长连续字符的切片,不需要重新构建重复字符的字符串——正确思路是在遍历过程中记录最长序列在原字符串中的位置,直接截取原字符串的切片返回,这样才能满足&str的生命周期要求。

原函数存在的问题

  1. 只记录了最长字符和出现次数,但没记录该序列在原字符串中的位置,无法生成对应切片;
  2. 初始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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 15:10:41