【问题标题】:How should I implement a substring function in java?我应该如何在java中实现子字符串函数?
【发布时间】:2023-03-09 15:11:01
【问题描述】:

假设你被告知要实现一种 java String.substring 方法。
该方法的签名如下:

public static boolean isSubstring(String i_StringForSearch, String i_SubStringToFind)

这是我的解决方案,但我觉得它仍然不是我能拥有的最好的优雅解决方案。(许多规范的 if else's)
你怎么看?你会用另一种方式来做吗?

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

【问题讨论】:

  • 您可能希望将其移至 codereview.stackexchange.com 以获得更好的响应! (如果是,也将其标记为作业)!
  • 在我看来,这更像是 contains 而不是 substringsubstring 有一个非常清楚的目的,这与这里的非常不同。
  • 你为什么要重新发明轮子?
  • 当你被告知要实现与通用构建 API 相同或可以使用的东西时,从头开始重写它是没有意义的。
  • 因为这是一个很好的练习,如果你是第一次被告知要写它的人,那你会说什么?

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


【解决方案1】:

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

【讨论】:

  • 我刚刚看到,当 n 是要搜索的字符串/文本的大小,m 是要搜索的子字符串的大小时,KMP 算法的复杂度是 Θ(n+m)。 Boyer-Moore 是 Θ(nm),所以它应该更糟。但是我的解决方案的复杂性呢?不也是Θ(n+m)吗?
  • @JavaSa 我不知道你现在在问什么。您要求最优雅的解决方案,它们就在那里。除非你能证明你的比任何一个都好,否则它是没有兴趣的。这取决于你。
【解决方案2】:
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;
}

【讨论】:

    猜你喜欢
    • 2012-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 2012-05-09
    • 1970-01-01
    相关资源
    最近更新 更多