【发布时间】:2019-11-29 09:34:49
【问题描述】:
获取连续相等字符的最长子串是一项功课。
pub fn longest_sequence(s: &str) -> Option<&str> {
let s_len = s.len();
if s_len == 0 {
return None
}
let mut cur_char = s.chars().nth(0);
let mut cur_occ = 0;
let mut max_char = s.chars().nth(0);
let mut max_occ = 0;
for i in 0..s_len {
let c = s.chars().nth(i);
if c == cur_char {
cur_occ = cur_occ + 1;
} else {
if cur_occ > max_occ {
max_occ = cur_occ;
max_char = cur_char;
}
cur_char = c.clone();
cur_occ = 1;
}
}
if cur_occ > max_occ {
max_occ = cur_occ;
max_char = cur_char;
}
let cr = max_char.unwrap();
let charstr = cr.to_string();
let string = charstr.repeat(max_occ);
let strr = string.as_str();
let some = Some(strr.clone());
println!("in {:?}",some);
some // Compilation error
// None // if returning None, then it compiles and runs as expected
}
fn main () {
println!("out {:?}",longest_sequence(&"aaabbbcccc"));
}
我希望输出是
in Some("cccc")
out Some("cccc")
但出现编译错误。
error[E0597]: `string` does not live long enough
--> r.rs:31:16
|
31 | let strr = string.as_str();
| ^^^^^^ borrowed value does not live long enough
...
35 | }
| - borrowed value only lives until here
|
note: borrowed value must be valid for the anonymous lifetime #1 defined on the function body at 1:1...
--> r.rs:1:1
|
1 | / pub fn longest_sequence(s: &str) -> Option<&str> {
2 | | let s_len = s.len();
3 | | if s_len == 0 {
4 | | return None
... |
34 | | some
35 | | }
| |_^
error: aborting due to previous error
如果返回 None 而不是 some,则代码会按预期编译和运行:
in Some("cccc")
out None
我很困惑,因为错误消息指向此更改之前的一行..
有人可以帮忙吗?谢谢。
P.S.:我把它改成记录开始和结束位置索引,这样我就可以返回Some(&s[start..end])。我认为s 绝对应该有足够的寿命,是的,它有效!但我仍然想知道为什么上面的实现不起作用..
【问题讨论】:
-
你创建了一个
String就返回它为什么你要返回一个&str -
@Stargateur 好吧.. 这是作业,这是必需的类型。我尝试将其更改为 String 并且它有同样的问题,所以没关系..
-
如果是作业,把它放在你的问题中会有所帮助。
-
好吧,你必须避免创建一个字符串,你必须在参数中使用str。
标签: rust