fn main() { println!("Hello, world!"); } pub fn longest_palindrome(s: String) -> String { let mut best = Vec::with_capacity(s.len()); let bytes = s.as_bytes(); for center in 0..bytes.len() { for (mut left_idx, mut right_idx) in [(center, center), (center, center + 1)] { expand(bytes, &mut left_idx, &mut right_idx); if right_idx - left_idx > best.len() { best = bytes[left_idx..right_idx].into(); } } } String::from_utf8(best).unwrap() } fn expand(bytes: &[u8], left_idx: &mut usize, right_idx: &mut usize) { loop { if bytes.get(*right_idx).is_none_or(|&r| bytes[*left_idx] != r) { *left_idx += 1; return; } match left_idx.checked_sub(1) { Some(new_left) => *left_idx = new_left, None => { *right_idx += 1; return; } } *right_idx += 1; } } #[cfg(test)] mod tests { use crate::longest_palindrome; #[test] fn test_1() { assert!( ["aba".to_string(), "bab".to_string()] .contains(&longest_palindrome("babad".to_string())) ); } #[test] fn test_2() { assert_eq!(longest_palindrome("cbbd".to_string()), "bb".to_string()); } #[test] fn test_3() { assert_eq!(longest_palindrome("whdqcudjpisufnrtsyupwtnnbsvfptrcgvobbjglmpynebblpigaflpbezjvjgbmofejyjssdhbgghgrhzuplbeptpaecfdanhlylgusptlgobkqnulxvnwuzwauewcplnvcwowmbxxnhsdmgxtvbfgnuqdpxennqglgmspbagvmjcmzmbsuacxlqfxjggrwsnbblnnwisvmpwwhomyjylbtedzrptejjsaiqzprnadkjxeqfdpkddmbzokkegtypxaafodjdwirynzurzkjzrkufsokhcdkajwmqvhcbzcnysrbsfxhfvtodqabvbuosxtonbpmgoemcgkudandrioncjigbyizekiakmrfjvezuzddjxqyevyenuebfwugqelxwpirsoyixowcmtgosuggrkdciehktojageynqkazsqxraimeopcsjxcdtzhlbvtlvzytgblwkmbfwmggrkpioeofkrmfdgfwknrbaimhefpzckrzwdvddhdqujffwvtvfyjlimkljrsnnhudyejcrtrwvtsbkxaplchgbikscfcbhovlepdojmqybzhbiionyjxqsmquehkhzdiawfxunguhqhkxqdiiwsbuhosebxrpcstpklukjcsnnzpbylzaoyrmyjatuovmaqiwfdfwyhugbeehdzeozdrvcvghekusiahfxhlzclhbegdnvkzeoafodnqbtanfwixjzirnoaiqamjgkcapeopbzbgtxsjhqurbpbuduqjziznblrhxbydxsmtjdfeepntijqpkuwmqezkhnkwbvwgnkxmkyhlbfuwaslmjzlhocsgtoujabbexvxweigplmlewumcone".to_string()), "wfdfw".to_string()); } #[test] fn test_4() { assert_eq!(longest_palindrome("a".to_string()), "a".to_string()); } }