gpt4 book ai didi

rust - 检测按顺序发生的字符串片段的重复元素

转载 作者:行者123 更新时间:2023-12-03 11:35:20 24 4
gpt4 key购买 nike

我需要检测并列出以大于或等于N次的顺序重复自身的slice的字符串字符。我已经(在下面)设法在Rust中编写了非高阶函数解决方案,但是我想知道是否可以简化为链接iter方法。
这个想法:

let v = "1122253225";
let n = 2;
输出:
There are 2 repetition of '1'
There are 3 repetition of '2'
There are 2 repetition of '2'
重复发生的索引并不重要。重复必须按顺序进行(例如,“2”的3个重复与其他值的“2”计数的另外2个重复分开,作为单独的输出线)。
我的非迭代器解决方案:
    let mut cur_ch = '\0';
let mut repeat = 0;

for ch in v.chars() {
if ch == cur_ch {
repeat = repeat + 1;
}
else {
if repeat >= n {
printf!("There are {} repetition of '{}'", repeat, cur_ch);
}
cur_ch = ch;
repeat = 1;
}
}

if repeat >= n {
printf!("There are {} repetition of '{}'", repeat, cur_ch);
}
它可以工作,但是有没有更好的方法可以通过链接迭代方法来做到这一点?

最佳答案

这是使用scanfilter_map的解决方案:

fn main() {
let s = "112225322555";
let n = 2;

let i = s
.chars()
.map(|v| Some(v))
.chain(std::iter::once(None))
.scan((0, None), |(count, ch), v| match ch {
Some(c) if *c == v => {
*count += 1;
Some((None, *count))
}
_ => Some((ch.replace(v), std::mem::replace(count, 1))),
})
.filter_map(|(ch, count)| match ch {
Some(Some(ch)) if count >= n => Some((ch, count)),
_ => None,
});

for (ch, num) in i {
println!("There are {} repititions of {}", num, ch);
}
}
Playground Link
第一步是使用 scan来计算相邻字符的数量。 scan的第一个参数是状态变量,该变量将传递给您作为第二个参数传递的闭包的每次调用。在这种情况下,状态变量是一个包含当前字符及其可见次数的元组。
笔记:
  • 我们需要将迭代范围扩展到正在分析的字符串的末尾(否则,我们将错过字符串的末尾包含满足条件的一系列字符的情况)。为此,我们将迭代映射到Option<char>中,然后将其链接到一个None上。这比特殊字符(例如\0)更好,这样我们甚至可以计算\0字符。
  • 出于相同的原因,我们将Option<char>用作状态元组中的当前字符。
  • scan的返回值是(Option<Option<char>>, i32)的迭代器。元组中的第一个值将是迭代器中每个重复字符的None,而在字符更改的每个边界处,它将是Some(Some(char))
  • 在将状态元组设置为新值的同时,我们使用replace返回当前字符并计数。

  • 最后一步是使用 filter_map进行以下操作:
  • 删除(None, i32)变体,该变体指示传入字符没有变化
  • 过滤掉计数未达到限制n的情况。
  • 关于rust - 检测按顺序发生的字符串片段的重复元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63327968/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com