解题思路:

  • *切割为数组,其长度不等于4,不是IPV4
  • 某个元素+开头,不是IPV4
  • 某个元素0开头却长度大于1,不是IPV4

以下代码中多次用到match,是为了清晰地表示以上判断。

use std::io::{self, *};

fn main() {
    let stdin = io::stdin();
    for line in stdin.lock().lines() {
        let ll = line.unwrap();
        let v = ll.trim().split(".").collect::<Vec<&str>>();
        let mut is_ipv_4 = true;
        match v.len() {
            0..=3 | 5..=usize::MAX => is_ipv_4 = false,
            _ => {
                for &i in v.iter() {
                    is_ipv_4 = match i.get(0..1) {
                        Some("0") => match i.len() {
                            2..=usize::MAX => false,
                            _ => true,
                        },
                        Some("+") => false,
                        _ => {
                            let e = i.trim().parse::<u32>().unwrap_or(256);
                            match e {
                                0..=255 => true,
                                _ => false,
                            }
                        }
                    };
                    if !is_ipv_4 {
                        break;
                    }
                }
            }
        }
        match is_ipv_4 {
            true => println!("YES"),
            false => println!("NO"),
        }
    }
}