javascript - String.prototype.indexOf() 的运行时复杂度是多少?
问题描述
在 Leetcode 上解决 387. First Unique Character in a String 时,我对indexOf()
.
我最初使用 2 循环方法解决了这个问题,如下所示:
var firstUniqChar = function(s) {
const map = new Map();
const arr = s.split('');
let answer = -1;
for (let i = 0; i < arr.length; i++) {
if (map.has(arr[i])) {
map.set(arr[i], -1);
} else {
map.set(arr[i], i);
}
}
map.forEach((value) => {
if (value !== -1) {
if (value < answer || answer === -1) {
answer = value;
}
}
});
return answer;
};
它的运行时间为 100 毫秒,比其他 JS 提交快 91.92%。当我查看第 99 个百分位数的答案时,它是一个单循环解决方案,.indexOf()
每个字符使用两次。
var firstUniqChar = function(s) {
for (let i = 0; i < s.length; i++){
if (s.indexOf(s[i], i+1) === -1 &&
s.indexOf(s[i]) === i) {
return i;
}
}
return -1
};
参考Java 中的一个类似问题,它的indexOf()
函数似乎使用了一种简单的字符串搜索算法,运行时复杂度为O(n + m)
or O(n*m)
。如果是这种情况,那么第一个解决方案应该更快。但是,提交第二个解决方案给了我 88 毫秒(98.52 个百分点)。
我很难理解背后是如何indexOf()
发生的,这会给第二种解决方案带来线性运行时复杂性。JavaScript 中是否indexOf()
使用了不同的算法,使其运行时间为O(1)
? 如果有人能对此有所了解,将不胜感激。
解决方案
推荐阅读
- cakephp - 如何在 Cakephp 2 中为 XMLHttpRequest 编写 url
- java - 小部件中的自定义 TextClock
- python - 如何删除列表中的特定值?
- php - 此路由不支持 POST 方法。支持的方法:GET、HEAD。- 拉拉维尔
- typescript - 打字稿中类型的破坏
- amazon-web-services - AWS 蓝绿部署。在部署过程中,来自生产的新数据(数据库)会发生什么?
- python - 使用 tf.gather 在 keras 中自定义正则化
- reactjs - Next.js:为什么在 redux-saga 中使用 (store as sagaStore).sagaTask... 和 toPromise() 和 next-redux-wrapper?
- spring-boot - 创建名为“jmsConnectionFactory”的 bean 时出错 - NullPointerException - Spring Boot Kotlin
- php - 在functions.php中获取相关组的ACF字段值(通过Post Object)