0

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

公共静态布尔 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;
    }
4

2 回答 2

1

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

于 2012-09-03T22:02:32.110 回答
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;
}
于 2018-12-08T19:02:25.800 回答