【华为OJ】【100-配制文件恢复】

【华为OJ】【算法总篇章】


【华为OJ】【100-配制文件恢复】

【工程下载】


题目描述

有6条配置命令,它们执行的结果分别是:
命令                  执行
reset               reset what
reset board         board fault
board add           where to add
board delet         no board at all
reboot backplane    impossible
backplane abort     install first
he he               unkonw command

注意:he he不是命令。
为了简化输入,方便用户,以“最短唯一匹配原则”匹配:
1、若只输入一字串,则只匹配一个关键字的命令行。例如输入:r,根据该规则,匹配命令reset,
    执行结果为:reset what;输入:res,根据该规则,匹配命令reset,执行结果为:reset what;
2、若只输入一字串,但本条命令有两个关键字,则匹配失败。例如输入:reb,可以找到命令reboot backpalne,
    但是该命令有两个关键词,所有匹配失败,执行结果为:unkown command
3、若输入两字串,则先匹配第一关键字,如果有匹配但不唯一,继续匹配第二关键字,如果仍不唯一,匹配失败。
    例如输入:r b,找到匹配命令reset board,执行结果为:board fault。
4、若输入两字串,则先匹配第一关键字,如果有匹配但不唯一,继续匹配第二关键字,如果唯一,匹配成功。
    例如输入:b a,无法确定是命令board add还是backplane abort,匹配失败。
5、若输入两字串,第一关键字匹配成功,则匹配第二关键字,若无匹配,失败。例如输入:bo a,确定是命令board add,匹配成功。
6、若匹配失败,打印“unkonw command”

输入描述

多行字符串,每行字符串一条命令

输出描述

执行结果,每条命令输出一行

输入例子

reset
reset board
board add
board delet
reboot backplane
backplane abort

输出例子

reset what
board fault
where to add
no board at all
impossible
install first

算法实现

import java.util.*;

/**
 * Author: 王俊超
 * Time: 2016-05-04 21:02
 * CSDN: http://blog.csdn.net/derrantcm
 * Github: https://github.com/Wang-Jun-Chao
 * Declaration: All Rights Reserved !!!
 */
public class Main {

    private final static String[] ACTION = {
            "reset", "reset what",
            "reset board", "board fault",
            "board add", "where to add",
            "board delet", "no board at all",
            "reboot backplane", "impossible",
            "backplane abort", "install first"
    };

    private final static String UC = "unkown command";


    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
//        Scanner scanner = new Scanner(Main.class.getClassLoader().getResourceAsStream("data2.txt"));
        List cmds = new LinkedList<>();
        while (scanner.hasNextLine()) {
            String cmd = scanner.nextLine();
            cmds.add(cmd);
//            System.out.println(num + " " + command);
        }
        System.out.print(fileRestore(cmds));
        scanner.close();
    }

    private static String fileRestore(List cmds) {

        StringBuilder builder = new StringBuilder();
        for (String cmd : cmds) {
//            System.out.println(cmd + ": " + getAction(cmd));
            builder.append(getAction(cmd)).append('\n');
        }
        return builder.toString();
    }

    private static String getAction(String cmd) {

        String[] part = cmd.split("(\\s)+");

        // 如果是一字串,只有第一个命令是一字串
        if (part.length == 1) {
            // 是以part[0]开头
            if (ACTION[0].startsWith(part[0])) {
                // 返回执行命令
                return ACTION[1];
            } else {
                return UC;
            }
        } else if (part.length == 2) {
            // 除了第一个命令其它的都是二字串
            int count = 0;
            String result = UC;
            // 检查是否匹配命令
            for (int i = 2; i < ACTION.length; i += 2) {
                String[] cmdPart = ACTION[i].split("(\\s)+");
                if (cmdPart[0].startsWith(part[0]) && cmdPart[1].startsWith(part[1])) {
                    count++;
                    result = ACTION[i + 1];
                }
            }

            // 刚好找到一个匹配的
            if (count == 1) {
                return result;
            }
            // 没有找到或者找到多个匹配的
            else {
                return UC;
            }

        }
        // 除了一字串和二字串,没有其它串
        else {
            return UC;
        }
    }
}

你可能感兴趣的:(华为OJ,华为OJ)