题解 | #密码截取#
密码截取
http://www.nowcoder.com/practice/3cd4621963e8454594f00199f4536bb1
可以用DP来做,其实就是求最长回文子串。
use std::io::{self, *};
pub fn longest_palindrome(s: String) -> String {
let arr: Vec<char> = s.chars().collect();
let mut dp: Vec<Vec<bool>> = Vec::new();
let mut start_idx = 0usize;
let mut max = 1usize;
let count = s.chars().count();
dp = (0..count).map(|_x| vec![false; count]).collect();
for size in 2..=count {
for i in 0..count {
let j = size + i - 1;
if j >= count {
break;
}
if arr[i] == arr[j] {
if size >= 4 {
dp[i][j] = dp[i + 1][j - 1];
} else {
dp[i][j] = true;
}
} else {
dp[i][j] = false;
}
if dp[i][j] && size > max {
max = size;
start_idx = i;
}
}
}
arr.iter()
.enumerate()
.filter(|&(i, _v)| i >= start_idx && i < start_idx + max)
.map(|(_i, v)| v)
.collect()
}
fn main() {
let stdin = io::stdin();
for line in stdin.lock().lines() {
let ll = line.unwrap();
println!("{}", longest_palindrome(ll).len());
}
}
用 Rust 刷华为机试HJ 文章被收录于专栏
用 Rust 刷 HJ100 题,只需要懂基础 Rust 语法就能看懂