我应该如何在java中实现子字符串函数?

时间:2012-09-03 17:35:52

标签: java string substring complexity-theory time-complexity

考虑到你被告知要实现一种java String.substring方法 该方法的签名如下:

public static boolean isSubstring(String i_StringForSearch,String i_SubStringToFind)

这是我的解决方案,但我觉得它仍然不是我能提供的最佳解决方案。(许多规范,如果不是的话)
你怎么看?你会以另一种方式做到吗?

public static boolean isSubstring(String i_StringForSearch, String i_SubStringToFind)
    {
        int strForSearchIndex = 0;
        int subStrToFindIndex = 0;
        boolean endOfStringToSearch = false;
        boolean foundSubString = false;
        boolean isThereASequenceOfMatching = false;


        while(!endOfStringToSearch && !foundSubString)
        {
            if(strForSearchIndex == i_StringForSearch.length())
            {
                endOfStringToSearch = true;
            }

            else if(i_StringForSearch.charAt(strForSearchIndex) == i_SubStringToFind.charAt(subStrToFindIndex))
            {
                isThereASequenceOfMatching = true;
                if(subStrToFindIndex == i_SubStringToFind.length() -1 )
                {
                    foundSubString = true;
                }
                subStrToFindIndex++;
                strForSearchIndex++;
            }

            else if(i_StringForSearch.charAt(strForSearchIndex) != i_SubStringToFind.charAt(subStrToFindIndex))
            {
                if(isThereASequenceOfMatching)
                {
                    subStrToFindIndex = 0;
                    isThereASequenceOfMatching = false;
                }
                strForSearchIndex++;
            }
        }

       return foundSubString;
    }

2 个答案:

答案 0 :(得分:1)

查看Boyer-Moore和Knuth-Morris-Pratt算法。在许多年前的测试中,我发现BM稍快一点。

答案 1 :(得分:0)

public static boolean isSubstring(final String i_StringForSearch, final String i_SubStringToFind) {
    int j = 0;
    for (int i = 0; i < i_StringForSearch.length(); i++) {
        if (i_StringForSearch.charAt(i) == i_SubStringToFind.charAt(j)) {
            j++;
            if (j == i_SubStringToFind.length()) {
                return true;
            }
        }
    }
    return false;
}