【发布时间】:2018-09-05 15:50:13
【问题描述】:
在第一行输入会有秘密信息(数字序列)。例如1122
在第二个输入行将有用于以给定格式对消息进行编码的密码:
“{LetterX}{CodeForX}{LetterY}{CodeForY}…”原始消息中的每个 LetterX 都将在密码中使用 CodeForX 进行编码。例如A1B12C11D2打印可以编码为给定密码的所有可能的原始消息的数量。在接下来的几行中,打印这些消息。 例如 3 -> AADD ABD CDD
我的想法是检查消息中是否存在字符串开头的任何字母代码(例如“1”、“12”等),如果找到,则将其从其中删除并递归处理直到结束到达字符串的长度。
public class Main {
static List<String> gList = new ArrayList<>();
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String message = in.readLine(); // "1122"
String codeStr = in.readLine(); // "A1B12C11D2"
// SPLITTING LETTERS FROM CODES:
String [] secretCode = codeStr.split("[^A-Z0-9]+|(?<=[A-Z])(?=[0-9])|(?<=[0-9])(?=[A-Z])");
int n = secretCode.length / 2;
String [] letters = new String [n]; // [A B C D]
String [] codes = new String [n]; // [1 12 11 2]
for (int i = 0; i < 2 * n; i+=2) {
letters[i/2] = secretCode[i];
codes[i/2] = secretCode[i+1];
}
CodesCheck(message, letters, codes);
System.out.println(Arrays.toString(gList.toArray()));
}
static void CodesCheck (String message, String[] letters, String[] codes) {
for (int i = 0; i < codes.length; i++) {
if (codes[i].length() <= message.length() &&
codes[i].equals(message.substring(0, codes[i].length()))) {
gList.add(letters[i]);
String newMessage = message.substring(codes[i].length());
if (newMessage.equals("")) {
gList.add("|");
return;
}
CodesCheck(newMessage, letters, codes);
}
}
}
}
运行上面的代码时,我得到:
[A, A, D, D, |, B, D, |, C, D, D, |] -> 所以在第二条消息中缺少“A”字母。
当我调试时,我可以看到递归函数以某种方式以“122”而不是“1122”进行。
【问题讨论】:
-
为了完整起见,使用 HashMap(A -> 12 等)和一组字符串来保存结果的固定代码。以及适当的回溯:pastebin.com/B04Gw73H