Java:String.contains(string)函数如何在java中工作?

时间:2013-08-25 23:06:28

标签: java string substring contains

我知道蛮力方法的时间复杂度为n*m (m is length of first string and n is the length of the other one),用于测试一个字符串是否包含另一个字符串,但是,我想知道是否有更好的解决方案呢?

boolean contains(String input,String search)

4 个答案:

答案 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;
}