【发布时间】:2022-01-13 18:28:27
【问题描述】:
解决以下问题:
给定一个字符串s,求最长不重复字符的子串的长度。
我正在使用这种蛮力解决方案:
public class Solution {
public int lengthOfLongestSubstring(String s) {
int n = s.length();
int res = 0;
for (int i = 0; i < n; i++) {
for (int j = i; j < n; j++) {
if (checkRepetition(s, i, j)) {
res = Math.max(res, j - i + 1);
}
}
}
return res;
}
private boolean checkRepetition(String s, int start, int end) {
int[] chars = new int[128];
for (int i = start; i <= end; i++) {
char c = s.charAt(i);
chars[c]++;
if (chars[c] > 1) {
return false;
}
}
return true;
}
}
大O符号如下:
我知道三个嵌套迭代会导致时间复杂度 O(n^3)。
我只看到公式开头使用了两个 sigma 运算符,有人可以告诉我第三次迭代在公式开头的位置吗?
【问题讨论】:
-
如果写成
∑ j=i+1 n (j−i)而不是∑ j=i+1 n (∑ k=i j 1),也许你会更好地理解这个符号?如,从i到j有一个内部循环。他们把它写成(j-i),因为∑ k=i j 1只是1加在一起(j-i)次。 -
checkRepetition(s, i, j)是 O(1) 时间,而不是 ji,所以整个计算是错误的(至少实际上从技术上讲是正确的,因为 big-O 是一个上限)。 -
我从未见过像这样的大 O 符号,坦率地说希望再也不会看到它们——学术界以外的人不会关心这样的细节。只需坚持基本风味 O(1)、O(log n)、O(n)、O(n log n)、O(n²) 等
-
@PaulHankin 从
start到end的循环是常数? -
这是一个 java 问题,而不是 Computer Science 问题? Stack Overflow 专注于实践,而不是理论(虽然 big-O 在实践中可能很有用,但 Bohemian 在实际实践中如何使用它;这里的示例就像添加一个小数点后的一堆数字,这是一个疯狂的近似值——它实际上并没有以一种实用的方式使任何东西变得更精确)。
标签: java algorithm data-structures big-o