【问题标题】:Do String methods in Java run in O(1) time?Java 中的 String 方法是否在 O(1) 时间内运行?
【发布时间】:2018-05-28 06:39:23
【问题描述】:

这是我在不重复字符的情况下查找最长子字符串长度的代码。此代码是否在 O(n) 时间内运行?或者它是否在 O(n^2) 时间内运行?我不确定 String 方法是在 O(n) 时间还是 O(1) 时间内运行。

一个测试用例包括:“pwwkewo”返回 4,因为“kewo”是字符串中具有唯一字符的最长子字符串。

public int lengthOfLongestSubstring(String s) {

    int maxLength = 0;
    String sub = "";

    for(int i=0; i<s.length(); i++) {

         //add that char to the sub string
         sub = sub + s.charAt(i);

        //if we find a char in our string
        if(sub.indexOf(s.charAt(i)) != -1) {

           //drop any replicated indexes before it
            sub = sub.substring(sub.indexOf(s.charAt(i)) + 1);
        }

        if(sub.length() > maxLength) {
            maxLength = sub.length();
        }


    }

    return maxLength;

}

【问题讨论】:

  • 我猜它的 O(n) 因为你拥有的字符越多,花费的时间就越长
  • 不会是 O(N^2) 因为sub.indexOf() 是 O(N) 吗?顺便说一句,sub = sub + s.charAt(i); 导致了一个非常低效的循环,因为有很多多余的内存分配 - 请查看 StringBuilder
  • 取决于您的 Java 版本。检查stackoverflow.com/questions/4679746/…

标签: java string algorithm big-o


【解决方案1】:

您的代码在O(n^2) 中运行,因为有一个for 循环,在其中您调用indexOf() 方法。这又是O(n)

因此你的方法是O(n^2)

【讨论】:

  • 并且循环中有更多的 O(n) 操作:sub = sub + s.charAt(i);(最好使用StringBuilder)、sub.substring(...)(在以后的 Java 版本中,这会创建字符的副本)。并且做两次sub.indexOf(s.charAt(i) 也是浪费时间,但不会影响 Big-O 分类。
【解决方案2】:

sub.indexOf() 可能需要线性时间,因为它可能必须检查sub 的所有字符。在最坏的情况下,sub 的长度为 O(n)(假设您的输入没有重复字符)。

因此,您的总运行时间为 O(n2),因为循环具有 n 迭代,并且在每次迭代中您调用 indexOf()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多