Skip to content

Commit f3cca65

Browse files
authored
Update s0014_longest_common_prefix.rs
Solution with one loop
1 parent 69fb9b8 commit f3cca65

File tree

1 file changed

+32
-21
lines changed

1 file changed

+32
-21
lines changed

src/solution/s0014_longest_common_prefix.rs

Lines changed: 32 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -33,33 +33,44 @@ pub struct Solution {}
3333
// submission codes start here
3434

3535
use std::str::Chars;
36+
3637
impl Solution {
38+
3739
pub fn longest_common_prefix(strs: Vec<String>) -> String {
38-
let mut prefix = String::new();
39-
let mut iters: Vec<Chars> = strs.iter().map(|s| s.chars()).collect();
40-
let mut curr_char: Option<char> = None;
41-
if strs.len() < 1 {
42-
return prefix;
43-
}
44-
loop {
45-
curr_char.take().map(|ch| prefix.push(ch));
46-
for iter in iters.iter_mut() {
47-
let mut ch = iter.next();
48-
if ch.is_none() {
49-
return prefix;
50-
}
51-
match curr_char {
52-
None => curr_char = ch.take(),
53-
Some(curr) => {
54-
if curr != ch.unwrap() {
55-
return prefix;
56-
}
57-
}
40+
let mut chars = strs.first().expect("Ok").clone();
41+
strs.iter().map(|v| v.chars()).fold(chars, |prev, cur: Chars| {
42+
let len = longest_len(&(prev.chars()), &cur);
43+
let mut ch = String::from("");
44+
if len == 0 {
45+
return ch;
46+
}
47+
48+
49+
50+
let mut iter_prev = prev.chars().into_iter();
51+
let mut iter_cur = cur.into_iter();
52+
53+
for i in 0..=len-1 {
54+
let p = iter_prev.next().unwrap();
55+
if p == iter_cur.next().unwrap() {
56+
ch.push(p);
57+
} else {
58+
break;
5859
}
5960
}
60-
}
61+
return ch;
62+
})
63+
}
64+
}
65+
pub fn longest_len<'a>(a: &'a Chars, b: &'a Chars) -> usize {
66+
let a_len = a.clone().count();
67+
let b_len = b.clone().count();
68+
if a_len > b_len {
69+
return b_len;
6170
}
71+
a_len
6272
}
73+
6374

6475
// submission codes end
6576

0 commit comments

Comments
 (0)