Javascript 这种将N个长度的消息修剪为M个长度的解决方案的时间复杂度是多少?

Javascript 这种将N个长度的消息修剪为M个长度的解决方案的时间复杂度是多少?,javascript,algorithm,big-o,Javascript,Algorithm,Big O,我正试图获得以下问题的解决方案的正确时间复杂度: Input: a string contains spaces and words, and an integer M Output: trim the string so the trimmed string length <= m and no cut-off word. Sample: S = "This is JavaScript", M = 10. Expect: "This is" //

我正试图获得以下问题的解决方案的正确时间复杂度:

Input: a string contains spaces and words, and an integer M
Output: trim the string so the trimmed string length <= m and no cut-off word.
Sample:
S = "This is JavaScript", M = 10.
Expect: "This is" // because "This is Ja" is invalid, "JavaScript" is cut. 
S = "JavaScript", M = 5
Expect: "" // empty because the output "JavaS" is invalid.
S = "JavaScript", M = 10
Expect: "JavaScript"
我认为总的时间复杂度是O(N),其中N=len(S),但我不确定,因为while循环

while循环将运行O(N-M)次。在每次迭代中,代码都会执行O(N)操作来查找最后一个空间索引,
slice()
操作会执行O(N),因此看起来像O(N^2)。但是,在每次迭代之后,字符串变得越来越小

制作复制字符串O(N)的时间不会影响整个大O。

时间复杂度为O(N²),因为您重复执行
切片,每次都会创建一个新字符串。虽然
slice
的实现速度很快,但它在时间上不是常数,而是与其长度成正比

您应该只处理索引,并在最后执行“昂贵的”
slice
。还要注意的是,不需要初始切片,因为字符串是不可变的。即使您想修改,也不可能修改

下面是您的代码,它只适用于在结尾执行
切片
。注意:我不会在变量名中使用首字母大写,因为这通常是为构造函数的名称保留的

函数修剪此(s,m){
设endIdx=s.长度;
而(endIdx>m){
lastSpaceIdx=s.lastIndexOf(“”,endIdx-1);
如果(lastSpaceIdx!=-1){
endIdx=lastSpaceIdx;
}否则返回“”;
}
而(endIdx>0&&s[endIdx-1]=''){
endIdx--;
}
返回s.slice(0,endIdx);
}
让我们=“我们生活在一个有趣的时代”;
设res=trimpthis(s,20);

控制台日志(res)请正确解释您的输入、输出。什么是截止词?谢谢。我已经更新了问题,让它更清楚。谢谢@trincot!“尽管slice的实现速度很快,但它在时间上不是常数,而是与其长度成正比。”对于V8来说,这不再是事实@托马斯,的确如此。只要这不是EcmaScript需求的一部分,我们就不应该依赖它。