From 009f2f9b2df2b7a85ccb8fa711fea8906f187dc8 Mon Sep 17 00:00:00 2001 From: wavty Date: Fri, 25 Aug 2023 00:16:47 +0800 Subject: [PATCH 1/2] feat: update rust solution to lc problem: No.0005 No.0005.Longest Palindromic Substring --- .../README.md | 55 +++++++++++++------ .../README_EN.md | 55 +++++++++++++------ .../Solution.rs | 46 +++++++++------- 3 files changed, 101 insertions(+), 55 deletions(-) diff --git a/solution/0000-0099/0005.Longest Palindromic Substring/README.md b/solution/0000-0099/0005.Longest Palindromic Substring/README.md index 6e35a78215066..c34926a478c2b 100644 --- a/solution/0000-0099/0005.Longest Palindromic Substring/README.md +++ b/solution/0000-0099/0005.Longest Palindromic Substring/README.md @@ -362,30 +362,51 @@ function longestPalindrome(s: string): string { ```rust impl Solution { pub fn longest_palindrome(s: String) -> String { - let n = s.len(); - let s = s.as_bytes(); - let is_pass = |mut l, mut r| { - while l < r { - if s[l] != s[r] { - return false; + let (n, mut ans) = (s.len(), &s[..1]); + let mut dp = vec![vec![false; n]; n]; + let data: Vec = s.chars().collect(); + + for end in 1..n { + for start in 0..=end { + if data[start] == data[end] { + dp[start][end] = end - start < 2 || dp[start + 1][end - 1]; + if dp[start][end] && (end - start + 1) > ans.len() { + ans = &s[start..=end]; + } } - l += 1; - r -= 1; } - true - }; - let mut res = &s[0..1]; - for i in 0..n - 1 { - for j in (i + 1..n).rev() { - if res.len() > j - i { + } + ans.to_string() + } +} +``` + +```rust +impl Solution { + pub fn is_palindrome(s: &str) -> bool { + let mut chars = s.chars(); + while let (Some(c1), Some(c2)) = (chars.next(), chars.next_back()) { + if c1 != c2 { + return false; + } + } + true + } + + pub fn longest_palindrome(s: String) -> String { + let size = s.len(); + let mut ans = &s[..1]; + for i in 0..size - 1 { + for j in (i + 1..size).rev() { + if ans.len() > j - i + 1 { break; } - if is_pass(i, j) { - res = &s[i..=j]; + if Solution::is_palindrome(&s[i..=j]) { + ans = &s[i..=j]; } } } - res.into_iter().map(|c| char::from(*c)).collect() + return ans.to_string(); } } ``` diff --git a/solution/0000-0099/0005.Longest Palindromic Substring/README_EN.md b/solution/0000-0099/0005.Longest Palindromic Substring/README_EN.md index 7f2876e42d64f..f7e9048555388 100644 --- a/solution/0000-0099/0005.Longest Palindromic Substring/README_EN.md +++ b/solution/0000-0099/0005.Longest Palindromic Substring/README_EN.md @@ -347,30 +347,51 @@ function longestPalindrome(s: string): string { ```rust impl Solution { pub fn longest_palindrome(s: String) -> String { - let n = s.len(); - let s = s.as_bytes(); - let is_pass = |mut l, mut r| { - while l < r { - if s[l] != s[r] { - return false; + let (n, mut ans) = (s.len(), &s[..1]); + let mut dp = vec![vec![false; n]; n]; + let data: Vec = s.chars().collect(); + + for end in 1..n { + for start in 0..=end { + if data[start] == data[end] { + dp[start][end] = end - start < 2 || dp[start + 1][end - 1]; + if dp[start][end] && (end - start + 1) > ans.len() { + ans = &s[start..=end]; + } } - l += 1; - r -= 1; } - true - }; - let mut res = &s[0..1]; - for i in 0..n - 1 { - for j in (i + 1..n).rev() { - if res.len() > j - i { + } + ans.to_string() + } +} +``` + +```rust +impl Solution { + pub fn is_palindrome(s: &str) -> bool { + let mut chars = s.chars(); + while let (Some(c1), Some(c2)) = (chars.next(), chars.next_back()) { + if c1 != c2 { + return false; + } + } + true + } + + pub fn longest_palindrome(s: String) -> String { + let size = s.len(); + let mut ans = &s[..1]; + for i in 0..size - 1 { + for j in (i + 1..size).rev() { + if ans.len() > j - i + 1 { break; } - if is_pass(i, j) { - res = &s[i..=j]; + if Solution::is_palindrome(&s[i..=j]) { + ans = &s[i..=j]; } } } - res.into_iter().map(|c| char::from(*c)).collect() + return ans.to_string(); } } ``` diff --git a/solution/0000-0099/0005.Longest Palindromic Substring/Solution.rs b/solution/0000-0099/0005.Longest Palindromic Substring/Solution.rs index fc9597ef9f94e..16c11f6d157de 100644 --- a/solution/0000-0099/0005.Longest Palindromic Substring/Solution.rs +++ b/solution/0000-0099/0005.Longest Palindromic Substring/Solution.rs @@ -1,28 +1,32 @@ impl Solution { pub fn longest_palindrome(s: String) -> String { - let n = s.len(); - let s = s.as_bytes(); - let is_pass = |mut l, mut r| { - while l < r { - if s[l] != s[r] { - return false; - } - l += 1; - r -= 1; - } - true - }; - let mut res = &s[0..1]; - for i in 0..n - 1 { - for j in (i + 1..n).rev() { - if res.len() > j - i { - break; - } - if is_pass(i, j) { - res = &s[i..=j]; + let (n, mut ans) = (s.len(), &s[..1]); + let mut dp = vec![vec![false; n]; n]; + let data: Vec = s.chars().collect(); + + for end in 1..n { + for start in 0..=end { + if data[start] == data[end] { + dp[start][end] = end - start < 2 || dp[start + 1][end - 1]; + if dp[start][end] && (end - start + 1) > ans.len() { + ans = &s[start..=end]; + } } } } - res.into_iter().map(|c| char::from(*c)).collect() + ans.to_string() } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn palindrome() { + assert_eq!(Solution::longest_palindrome(String::from("aba")), String::from("aba")); + assert_eq!(Solution::longest_palindrome(String::from("babcd")), String::from("bab")); + assert_eq!(Solution::longest_palindrome(String::from("cbbd")), String::from("bb")); + assert_eq!(Solution::longest_palindrome(String::from("cbbc")), String::from("cbbc")); + } +} \ No newline at end of file From 6edf5b2d622c65328343581b6691e713de15dc6b Mon Sep 17 00:00:00 2001 From: wavty Date: Fri, 25 Aug 2023 14:38:24 +0800 Subject: [PATCH 2/2] delete test code --- .../0005.Longest Palindromic Substring/Solution.rs | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/solution/0000-0099/0005.Longest Palindromic Substring/Solution.rs b/solution/0000-0099/0005.Longest Palindromic Substring/Solution.rs index 16c11f6d157de..19e99c1b39b60 100644 --- a/solution/0000-0099/0005.Longest Palindromic Substring/Solution.rs +++ b/solution/0000-0099/0005.Longest Palindromic Substring/Solution.rs @@ -18,15 +18,3 @@ impl Solution { } } -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn palindrome() { - assert_eq!(Solution::longest_palindrome(String::from("aba")), String::from("aba")); - assert_eq!(Solution::longest_palindrome(String::from("babcd")), String::from("bab")); - assert_eq!(Solution::longest_palindrome(String::from("cbbd")), String::from("bb")); - assert_eq!(Solution::longest_palindrome(String::from("cbbc")), String::from("cbbc")); - } -} \ No newline at end of file