有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不是命令。
爲了簡化輸入,方便用戶,以「最短惟一匹配原則」匹配:
一、若只輸入一字串,則只匹配一個關鍵字的命令行。例如輸入:r,根據該規則,匹配命令reset,
執行結果爲:reset what;輸入:res,根據該規則,匹配命令reset,執行結果爲:reset what;
二、若只輸入一字串,但本條命令有兩個關鍵字,則匹配失敗。例如輸入:reb,能夠找到命令reboot backpalne,
可是該命令有兩個關鍵詞,全部匹配失敗,執行結果爲:unkown command
三、若輸入兩字串,則先匹配第一關鍵字,若是有匹配但不惟一,繼續匹配第二關鍵字,若是仍不惟一,匹配失敗。
例如輸入:r b,找到匹配命令reset board,執行結果爲:board fault。
四、若輸入兩字串,則先匹配第一關鍵字,若是有匹配但不惟一,繼續匹配第二關鍵字,若是惟一,匹配成功。
例如輸入:b a,沒法肯定是命令board add仍是backplane abort,匹配失敗。
五、若輸入兩字串,第一關鍵字匹配成功,則匹配第二關鍵字,若無匹配,失敗。例如輸入:bo a,肯定是命令board add,匹配成功。
六、若匹配失敗,打印「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.*;
/**
* 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<String> 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<String> 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;
}
}
}