【发布时间】:2015-03-25 21:44:06
【问题描述】:
这与“如何检查字符串是否包含特定子字符串?”不同。 .我在这里没有发现这样的问题,但不是我要找的。 我正在一个竞争性编码站点上创建一个程序,该程序的问题表明我们得到了一个由 x、y、z 组成的字符串,我们必须计算包含至少一个字符但不是全部字符的子字符串的数量。我试过这个...
String text = sc.next();
int l = text.length();
int count=0;
for(int j =1;j<=l;j++)
{
for(int i1 =0;i1<j;i1++){
String g = text.substring(i1,j);
if(g.contains("xyz")||g.contains("xzy")||g.contains("yzx")||g.contains("yxz")||g.contains("zxy")||g.contains("zyx"))
;
else
count++;
}
}
System.out.println(count);
这有效(至少对于 2 个测试用例)。但是对于较大的测试用例,我的程序违反了时间限制。现在我认为这是因为 if 子句中匹配条件的数量。我想知道是否有任何方法可以检查子字符串是否以任何顺序包含“xyz”,而不是检查每个订单。谢谢!任何帮助表示赞赏。
P.S- 如果有其他原因导致违反时限,请务必提及!
【问题讨论】:
-
时间问题来自于您使用的是二次解决方案,其中包含两个嵌套的 for 循环。这种类型的解决方案需要 O (n^2) 时间,而需要更好的解决方案。
-
请发布一些带有等待结果的输入字符串
-
输入字符串来自所有案例都经过测试的输入文件!我现在无法发布它们,因为我现在可以访问我的笔记本电脑。我稍后会提供。至于现在,您能否提供嵌套 for 循环的替代方案? @lamsomeone &
-
其实这个解大概是O(n^3),因为
contains方法大概是O(n)线性搜索。 -
您正在将此输入拆分为非常小的部分 (text.substring(i1,j);)。你为什么不在全文上尝试你的 contains 方法,这将为你节省很多迭代。