题解 | #密码截取#

密码截取

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 语法就能看懂

全部评论
该牛油正在参与牛客写题解薅羊毛的活动,牛币,周边,京东卡超多奖品放送,活动进入倒计时!快来捡漏啦https://www.nowcoder.com/discuss/888949?source_id=profile_create_nctrack&channel=-1
点赞 回复 分享
发布于 2022-04-27 11:48

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务