看上去是group_by
, 不过group_by
不带索引信息, 因此还是需要自行遍历, 根据输入的字符进行状态变化.
预读: 检测后一个是否和当前相同, 如果相同延展一个, 如果不同, 检查长度是否达到要求, 特殊处理一下结尾
pub fn large_group_positions(s: String) -> Vec<Vec<i32>> {
let s = s.as_bytes();
let mut ret: Vec<Vec<i32>> = vec![];
let mut cnt = 1;
for i in 0..s.len() {
if i == s.len() - 1 || s[i] != s[i + 1] {
if cnt >= 3 {
// 必须是 `i + 1 - cnt`, 不能是 `i - cnt + 1`, 会溢出
ret.push(vec![(i + 1 - cnt) as i32, i as i32]);
}
cnt = 1;
} else {
cnt += 1;
}
}
ret
}