我正在看 godel escher bach 的 MU 谜题,我正在尝试实施一组规则。
规则是
规则 1:如果你的字符串以 I 结尾,你可以在末尾添加一个 U:x I → x IU
规则 2:如果字符串以 M 开头,则可以将 M 后面的内容加倍:M x → M x x
规则 3:如果字符串中有 III,则可以将其替换为 U:x III y → x U y
规则 4:如果字符串中有 UU,则可以将其完全删除:x UU y → x y
我从所有这些规则中得到了结果,但是我不相信我的规则 3 的代码有效。
我的字符串输入是“MIIII”
我得到输出:[MIIIIU,MIIIIIIIII,MUI,MIU]
我正在寻找哪个输出。
但是我相信我的编码方式并不能正确替换 U。
我想如果我的输入是“MIIIIII”我相信我应该得到结果MUU如果我错了请纠正我。
但是我的代码返回 MU,因为我使用 split 并向字符串添加一个 U,但是当我认为它应该返回两个 U 时,这会将所有 6 个 I 替换为 U。
我的这条规则的代码是
if(s.contains ("III")){
String parts[] = s.split("III");// split at III and handle empty string
String x = parts[0]; // Prefix;
String y = parts[1]; //suffix
list.add(x+"U"+y);
list.add(x+y+"U");
}
}
任何有关如何更好地解决此问题的建议将不胜感激。
谢谢
任何有关如何更好地解决此问题的建议将不胜感激。
这个问题很老了,但对于其他有类似问题的人来说,迟到的答案可能比没有好。
您使用
parts = s.split("III")
然后使用 parts[0] 和 parts[1] 的代码依赖于一些不成立的假设:
假设“III”之间和周围的子字符串将包含在 split() 的结果中,即使它们的长度为零。 s = "MIIIIII" 的情况并非如此,因为前三个 I 和后三个都被视为分隔符。因此,虽然您可能期望得到 ["M", "", ""] 作为结果,但文档显示“因此,尾随空字符串不包含在结果数组中。”所以结果实际上只是一部分:parts[0] = "M"。零件[1]不存在。 split() 对于这项任务来说确实不可靠。
假设“III”出现的次数是固定的。您的 list.add(...) 代码似乎期望您应该在两个地方用“U”替换“III”。但您的输入字符串可能只有一个“III”,或三个,等等。
相反,循环遍历字符串中出现的“III”,将每个出现的位置替换为“U”:
int nextIII = s.indexOf("III");
while (nextIII > -1) {
list.add(s.substring(0, nextIII) + "U" + s.substring(nextIII + 3));
nextIII = s.indexOf("III");
}