Javascript 比较字符串时的字符串方法与数组方法(大O)
假设我们正在比较两个字符串,这两个字符串有一个特殊的字符,它会导致一些不寻常的事情发生——在本例中,Javascript 比较字符串时的字符串方法与数组方法(大O),javascript,arrays,string,performance,big-o,Javascript,Arrays,String,Performance,Big O,假设我们正在比较两个字符串,这两个字符串有一个特殊的字符,它会导致一些不寻常的事情发生——在本例中,#字符删除前面的字符 这里有一个解决方案,使用字符串方法slice和concat,构建字符串,然后对它们进行比较: const checkSame = (a, b) => { let one = '' for(let i = 0; i < a.length; i++){ if(a[i] === '#'){ one.slice(0, -1) } els
#
字符删除前面的字符
这里有一个解决方案,使用字符串方法slice
和concat
,构建字符串,然后对它们进行比较:
const checkSame = (a, b) => {
let one = ''
for(let i = 0; i < a.length; i++){
if(a[i] === '#'){
one.slice(0, -1)
} else {
one.concat(a[i]);
}
}
let two = ''
for(let i = 0; i < b.length; i++){
if(b[i] === '#'){
one.slice(0, -1)
} else {
one.concat(b[i]);
}
}
return one === two
};
第二个解决方案使用了一个额外的循环,这使我认为,如果给定一个n
字符字符串,则需要O(3n)
时间(最坏情况),而第一个只需要O(2n)
时间
这是正确的吗?串接和切分字符串是否比使用数组更有效?或者,随着字符串长度的增长,两个字符串的最终比较是否也需要n
时间?O(3n)~O(2n)~O(n)
因此,这两个字符串的最坏情况复杂性基本相同
参考:
export const compareTwoStrings2 = (a, b) => {
let one = [];
for (let i = 0; i < a.length; i++) {
if (a[i] === "#") {
one.pop();
} else {
one.push(a[i]);
}
}
let two = [];
for (let i = 0; i < b.length; i++) {
if (b[i] === "#") {
two.pop();
} else {
two.push(b[i]);
}
}
for(let i = 0; i < one.length; i++){
if(one[i] !== two[i]) return false;
}
return true;
};