eclipse 我应该如何编写MU难题的规则3?

yvgpqqbh  于 5个月前  发布在  Eclipse
关注(0)|答案(1)|浏览(73)

我在看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,MIIIIIIII,MUI,MIU]
这是我正在寻找的输出。
然而,我相信我编码的方式并不能正确地替换U。
我想如果我的输入是“MIIIII”,我相信我应该得到MUU的结果,如果我错了,请纠正我。
但是我的代码返回MU,因为我使用split并向String添加一个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");
    }
}

字符串
任何关于如何更好地解决这个问题的建议将不胜感激。
谢谢

jckbn6z7

jckbn6z71#

任何关于如何更好地解决这个问题的建议将不胜感激。
这个问题已经很老了,但对于其他有类似问题的人来说,迟来的答案可能比没有好。
你的代码,使用parts = s.split("III"),然后使用parts[0]和parts[1],依赖于一些不成立的假设:
1.假设“III”之间及其周围的子串将被包含在split()的结果中,即使它们是零长度的。s =“MIIIII”的情况并非如此,因为前三个I和后三个I都被用作分隔符。因此,尽管您可能期望得到[“M”,“",“]作为结果,文档中说'尾随的空字符串因此不包含在结果数组中。'所以结果实际上只是一个部分:parts[0] =“M”。parts[1]不存在。split()对于这个任务来说真的不可靠。
1.假设“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", nextIII + 1);
}

字符串
(It看起来加里删除的答案有一个非常相似的方法,但它不太正确。)
请注意,你可能不必担心规则3在同一个字符串中应用零次,两次或三次等。假设你的程序的其余部分一直试图在多代中应用规则,这将照顾任何给定规则对单个字符串的多次应用。

相关问题