时间/空间复杂度

问题描述

学习考试。我认为时间复杂度为O(n ^ 2),空间为O(1)。请帮忙,我正确吗?

public static String lastSubstring(String s) {
    
    int start=0;
    int end = start+1;
    int len =0;
    
    while (end + len < s.length()) {

        if (s.charat(start + len) == s.charat(end + len)) {
            len++;
        } else if (s.charat(start + len) > s.charat(end + len)) {
            end += len + 1;
            len = 0;
        } else {
            start = end;
            end = start + 1;
            len = 0;
        }
    }
    return s.substring(start);
}

解决方法

时间复杂度为O(n),空间复杂度为O(1),其中n是输入字符串的长度。

空间复杂度为O(1),因为除了变量'start','end','len'之外,没有使用额外的空间。我在这里假设您不考虑返回的字符串占用的空间,如果考虑到这一点,则空间复杂度将变为O(n),因为最坏的情况是将返回长度为n的完整字符串。

时间复杂度为O(n),因为外部变量'end'仅从0增加到n。当“ end”大于输入长度n时,while循环中断。

时间复杂度将是O(n ^ 2),如果对于从0到n的每个“结束”迭代,您都迭代了另一个内部变量,则说从0到n的“ len”。 但是在您的情况下,没有迭代是'end'+'len'的函数,即使您必须从0重新开始'len',也没有迭代会仅上升到n + n = 2n。这就是为什么时间复杂度为O(n)的原因。