diff options
| author | Mistivia <i@mistivia.com> | 2025-08-08 01:30:30 +0800 |
|---|---|---|
| committer | Mistivia <i@mistivia.com> | 2025-08-08 01:30:30 +0800 |
| commit | 63e5f78e0754ba36347f3576ce3b12aa7e474073 (patch) | |
| tree | 3478e38f97dc42d50606a815de9c7054d4d17cca | |
| parent | c11891afff7ea6a4196bc50e5adac9a20bd4ec3d (diff) | |
p5
| -rw-r--r-- | src/bin/p0005.rs | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/src/bin/p0005.rs b/src/bin/p0005.rs new file mode 100644 index 0000000..ce4d5e4 --- /dev/null +++ b/src/bin/p0005.rs @@ -0,0 +1,59 @@ +impl Solution { + pub fn check_palindrome_len(s: &String, i: i32) -> (i32, i32, i32) { + let mut r = 0; + loop { + let next = r + 1; + if i - next < 0 + || i + next >= s.len() as i32 + || s.as_bytes()[(i-next) as usize] != s.as_bytes()[(i+next) as usize] { + break; + } + r = next; + } + let len1 = 2 * r + 1; + let start1 = i - r; + let end1 = i + r; + + r = 0; + loop { + let next = r + 1; + if i - next + 1 < 0 + || i + next >= s.len() as i32 + || s.as_bytes()[(i-next+1) as usize] != s.as_bytes()[(i+next) as usize] { + break; + } + r = next; + } + let len2 = 2 * r; + let start2 = i - r + 1; + let end2 = i + r; + + if len2 > len1 { + (len2, start2, end2) + } else { + (len1, start1, end1) + } + } + + pub fn longest_palindrome(s: String) -> String { + let mut maxpalinlen = -1; + let mut start: i32 = 0; + let mut end: i32 = 0; + for i in 0..s.len() { + let (palin_len, pstart, pend) = Self::check_palindrome_len(&s, i as i32); + if palin_len > maxpalinlen { + maxpalinlen = palin_len; + start = pstart; + end = pend; + } + } + s[start as usize ..(end + 1) as usize].to_string() + } +} + +struct Solution {} + +fn main () { + println!("{}", Solution::longest_palindrome("babad".to_string())); + println!("{}", Solution::longest_palindrome("cbbd".to_string())); +}
\ No newline at end of file |
