【发布时间】:2018-02-20 00:16:39
【问题描述】:
问题:
从字符串s 中删除子字符串t,重复并打印执行相同操作所涉及的步骤数。
解释/工作:
例如:
t = ab、s = aabb。第一步,我们检查t是否为 包含在s中。这里,t包含在中间,即a(ab)b。 因此,我们将删除它,结果将是ab并增加count的值为 1。我们再次检查t是否包含在s中。现在,t是 等于s,即(ab)。所以,我们从s中删除它并增加count。所以,由于t不再包含在s中,我们停止并打印count值,在本例中为 2。
所以,这是我尝试过的:
-
代码 1:
static int maxMoves(String s, String t) { int count = 0,i; while(true) { if(s.contains(t)) { i = s.indexOf(t); s = s.substring(0,i) + s.substring(i + t.length()); } else break; ++count; } return count; }由于某种原因,我只能通过 Hackerrank 上的 9/14 测试用例(我得到 “错误答案” 其余的用例)。过了一会儿,我发现Java中有一个叫做
replace()的方法。因此,我尝试通过替换if条件来使用它,并提出了第二个版本的代码。 -
代码 2:
static int maxMoves(String s, String t) { int count = 0,i; while(true) { if(s.contains(t)) s.replace(t,""); //Marked Statement else break; ++count; } return count; }但由于某种原因(我不知道为什么),上面代码中的 "Marked Statement" 被无限执行(我在替换 "Marked Statement" 时注意到了这一点 与
System.out.println(s.replace(t,""));)。我不是同样的原因。
因为我只通过了 9/14 的测试用例,所以一定有一些逻辑错误导致了“错误答案”。如果我使用 Code 1,我该如何克服?如果我使用代码 2,如何避免无限执行“标记语句”?或者有谁愿意推荐我一个Code 3?
提前谢谢你:)
【问题讨论】:
-
会发生什么,如果字符串在开头,那么
substring()的两个索引都是0? -
如果给定的 s 或 t 为空字符串会怎样?
-
想想下面的例子,"".replace("","")?这会结束吗?
-
你想解决the Hackerrank challenge Reducto吗?如果是这样,可能有多个字符串可能被删除,并且由于删除可能会创建新的子字符串出现,因此为每个子字符串顺序运行
maxCounts是不够的。 -
考虑字符串“cabaaba”,您应该从中删除两个子字符串“aa”和“bb”。去掉“aa”,你就得到了“cabba”。去掉“bb”,得到“caa”。但是您还没有完成,因为最终结果应该只是“c”。 (我没有详细研究过这个任务,但即使你删除字符串的顺序也可能很重要。例如,如果你有一个字符串“aaaa”,那么首先删除“aaa”将不再使你能够删除“ aa" 两次以将字符串缩减为 ""。)
标签: java string algorithm replace substring