Javascript 检查回文字符串数组的运行时
我编写了一个函数来查找字符串数组中的回文。首先,我循环遍历数组并检查每个项,看看它是否是一个回文,带有一个helper函数,该函数检查数组中每个索引处的单词(按字母)——这是O(n^2)对吗 然后,我改变了方法,弹出数组(将其视为堆栈),然后检查其中一项是否为回文,并在整个数组中使用array.length执行此操作。这是O(n),对吗Javascript 检查回文字符串数组的运行时,javascript,algorithm,Javascript,Algorithm,我编写了一个函数来查找字符串数组中的回文。首先,我循环遍历数组并检查每个项,看看它是否是一个回文,带有一个helper函数,该函数检查数组中每个索引处的单词(按字母)——这是O(n^2)对吗 然后,我改变了方法,弹出数组(将其视为堆栈),然后检查其中一项是否为回文,并在整个数组中使用array.length执行此操作。这是O(n),对吗 'use strict'; function isTextPalindrome(text) { //this ignores anything other t
'use strict';
function isTextPalindrome(text) {
//this ignores anything other than letters
text = text.replace(/[^a-zA-Z]/g, '').toLowerCase();
// console.log(text);
if (!text) {
return "There must be text as an input!";
}
var left = 0;
var right = text.length - 1;
while (left < right) {
if (text[left++] !== text[right--]) {
return false;
}
}
return true;
}
// console.log(isTextPalindrome('race car'));
function palindromesInArray(arr) {
var popped;
var count = 0;
//treat the array as a stack. don't loop through, just pop off one at a time to avoid extra run time cost.
while (popped = arr.pop()) {
if (typeof (popped) !== 'string') {
return "Only works on strings";
}
if (isTextPalindrome(popped)) {
count++;
}
}
// for (let i = 0; i < arr.length; i++) {
// if (typeof (arr[i]) !== 'string') {
// return "Only works on strings";
// }
// if (isTextPalindrome(arr[i])) {
// count++;
// }
// }
return count;
}
console.log(palindromesInArray(['mom', 'race car', 'dad', 'abba', 'redivider', 'noon', 'civic', 'level', 'blah'])) // returns 8
console.log(palindromesInArray(['mom', 'race car', 'dad', 'blah'])); // returns 3
“严格使用”;
函数ISTEXTPAILNDROME(文本){
//这会忽略除字母以外的任何内容
text=text.replace(/[^a-zA-Z]/g',).toLowerCase();
//console.log(文本);
如果(!text){
return“必须有文本作为输入!”;
}
左向量=0;
var right=text.length-1;
while(左<右){
如果(文本[左++]!==文本[右--]){
返回false;
}
}
返回true;
}
//log(isTextPalindrome(‘赛车’);
函数回文数组(arr){
var突然出现;
var计数=0;
//将阵列视为堆栈。不要循环,只需一次弹出一个,以避免额外的运行时成本。
while(popped=arr.pop()){
if(typeof(弹出)!='string'){
return“仅对字符串有效”;
}
if(isTextPalindrome(弹出)){
计数++;
}
}
//for(设i=0;i
检查长度为m
的字符串的回文是O(m)
简单地在长度n
的数组(或堆栈)上循环就是O(n)
如果最大字符串长度为
n
,则只需执行O(n^2)
。否则,它是O(n*m)
现在还不清楚您这里所说的O(n)
是什么意思(请记住,O(n)
表示计算量相对于输入长度的增长)。这里不清楚你想算什么
如果
n
是字符串数组中所有字符的长度之和,则两种算法都是O(n)
。如果你有n
-字符串的长度和m
数组中字符串的数量-你有O(nm)
有趣的。。。我没想到。有没有办法得到这样的函数O(n)?取决于你考虑什么“N”。记住big-oh表示法是最坏的情况,这就是为什么我提到n.hmm的最大长度字符串。假设arr是n?只有当arr为空时才是O(n):)我明白了……否则它将是O(n*m),仍然是线性的?谢谢