File tree 1 file changed +32
-21
lines changed
1 file changed +32
-21
lines changed Original file line number Diff line number Diff line change @@ -33,33 +33,44 @@ pub struct Solution {}
33
33
// submission codes start here
34
34
35
35
use std:: str:: Chars ;
36
+
36
37
impl Solution {
38
+
37
39
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 ;
58
59
}
59
60
}
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;
61
70
}
71
+ a_len
62
72
}
73
+
63
74
64
75
// submission codes end
65
76
You can’t perform that action at this time.
0 commit comments