我知道蛮力方法的时间复杂度为n*m (m is length of first string and n is the length of the other one)
,用于测试一个字符串是否包含另一个字符串,但是,我想知道是否有更好的解决方案呢?
boolean contains(String input,String search)
答案 0 :(得分:3)
您可以查看source:
public boolean contains(CharSequence s) {
return indexOf(s.toString()) > -1;
}
答案 1 :(得分:2)
我想知道是否有更好的解决方案吗?
有许多简单的字符串搜索算法;请参阅Wikipedia String Search页面。该页面包括复杂性特征......和参考。
标准的Java java.lang.String
实现使用了简单的搜索。维基百科页面上的一些算法在搜索阶段具有更好的复杂性,但需要非平凡的设置。我希望Sun / Oracle工程师进行了大量的实证测试,发现天真搜索在各种实际应用中平均平均
最后......
我知道蛮力方法的时间复杂度为
O(n*m)
实际上,这是最坏情况的复杂性。平均复杂度为O(n)
。考虑一下:
boolean bruteForceMatch (String str1, String str2) {
for (int i = 0; i < str.length(); i++) {
boolean matches = true;
for (int j = 0; j < str2.length(); j++) {
if (i + j >= str.length ||
str1.charAt(i + j) != str2.charAt(j)) {
matched = false;
break;
}
}
if (matched) {
return true;
}
}
return false;
}
最糟糕的情况发生在“AAA ......”和“AAA ...... B”等输入上。 (点表示重复。)
但是在平均情况下(例如,随机生成的输入字符串),str2
的每个位置都不会str1
“几乎匹配”。内循环通常在迭代中break
。
答案 2 :(得分:1)
有更好的方法吗?取决于你认为“更好”的东西。另一种方法是使用Pattern。但是,用户体验会有什么不同?它足够相关吗?
如果您真的想要使用最佳选项,请尝试使用两个选项,并进行足够的迭代。
答案 3 :(得分:1)
这是我的解决方案:
static boolean contain(String input,String search)
{
int[] searchIn = new int[search.length()];
searchIn[0] = 0;
//searchIn keep track of repeated values on search sting
//so if the search string is "abcabd" then the corresponding searchIn is
//0 0 0 1 2 0
int k = 0;
for(int i=1;i<search.length();i++)
{
if(search.charAt(i)== search.charAt(k))
{
searchIn[i] = ++k;
}
else
{
k =0;
searchIn[i] = k;
}
}
int i=0;
int j=0;
while(i<=input.length()-1 && j<=search.length()-1)
{
if(input.charAt(i) == search.charAt(j))
{
i++;
j++;
}
else
{
j = searchIn[j-1];
if(i==input.length()-1)
i++;
}
}
if(j==search.length())
return true;
else return false;
}