Javascript 如何使JS功能更快/降低复杂性0(n)/更高效

Javascript 如何使JS功能更快/降低复杂性0(n)/更高效,javascript,node.js,Javascript,Node.js,我正在研究HackerRank的一些挑战,我在使函数更快/更高效以使其在提交过程中不会超时方面遇到了一些问题。对于真正大的输入(例如:字符串长度为1000或更多),它通常会超时,而我使用的循环数是使函数工作的。我知道循环使复杂度为0(n*n)或0(n*n*n)。我理解为什么函数会因为上述复杂性问题而超时,但我不确定如何使函数更高效以处理更大的输入。我是一个自学成才的编码员,所以请彻底简单地解释任何答案,以便我能够学习。谢谢 下面是一个示例问题: 如果满足以下两个条件之一,则称字符串为特殊回文字符

我正在研究HackerRank的一些挑战,我在使函数更快/更高效以使其在提交过程中不会超时方面遇到了一些问题。对于真正大的输入(例如:字符串长度为1000或更多),它通常会超时,而我使用的循环数是使函数工作的。我知道循环使复杂度为0(n*n)或0(n*n*n)。我理解为什么函数会因为上述复杂性问题而超时,但我不确定如何使函数更高效以处理更大的输入。我是一个自学成才的编码员,所以请彻底简单地解释任何答案,以便我能够学习。谢谢

下面是一个示例问题:

如果满足以下两个条件之一,则称字符串为特殊回文字符串:

  • 所有字符都相同,例如aaa

  • 除中间字符外,所有字符都相同,例如aadaa。(acdca将不满足此规则,但aadaa将满足此规则)

特殊的回文子串是字符串中满足这些条件之一的任何子串。给定一个字符串,确定它可以形成多少个特殊的回文子字符串

例如,给定字符串s=mnonopoo,我们有以下特殊的回文子字符串:

  • m、 n,o,n,o,p,o,o
  • 不,大野,opo
功能描述

在下面的编辑器中完成substrCount函数。它应该返回一个整数,表示可以从给定字符串形成的特殊回文子字符串的数量。 substrCount具有以下参数:

  • n:一个整数,字符串s的长度
  • s:一串
函数子计数(n,s){
//如果每个字母都是自己的回文,那么可以从长度开始计数
设计数=n;
//用于获取正确字符串切片的空间
设空间=1;
//所以,我们只得到拆分后的完整字符串,没有重复的字符串
设numberToCount=n;
for(设i=0;i0){
//如果长度为偶数,则所有字符必须相同
如果(str.length%2==0){
let split=str.split(“”);
设matches=0;
for(设k=0;k1){
设splitMid=数学楼层(str.length/2);
设firstHalf=str.slice(0,splitMid);
设lastHalf=str.slice(splitMid+1,str.length);
如果(前半部分===后半部分){
如果(str.length==3){
计数++;
}否则{
设sNew=上半部分+下半部分;
设拆分=新拆分(“”);
设matches=0;
for(设k=0;k}
因为您只寻找特殊回文,而不是所有回文,这使得降低复杂性变得更容易,但即使如此,也会有一些特殊情况,如“abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab。我看不出有什么办法能把这个问题的复杂性降低得太多

我会这样做的。首先将所有重复的数字分组。我不确定最好的方法是什么,但我想也许可以创建一个对象数组,对象属性为count和letter

从总数0开始

然后,选择计数为1的所有对象,并检查其左侧和右侧的对象,如果它们具有相同的字母值,则取最大计数,并将该值+1添加到totalCount中(+1表示单个字母本身的计数)。如果任意一侧的字母值不匹配,只需添加1(以说明字母本身)

它处理所有奇数回文。现在来处理偶数回文

选择计数大于1的所有对象,并获取其计数值,然后将1-count系列添加到totalCount。计算公式为(计数/2)*(1+计数)。 例子: 在字符串中,您有一个4 a的运行。其中有特殊的回文(a,a,a,a,aa,aa,aa,aaa,aaa,aaaa),总共有10个。(4/2)*(1+4)=10


我不知道这会减少多少处理时间,但我相信应该会减少一些。

我提出了一个解决方案,我认为它在性能方面并不太复杂(一次一个循环和一个递归)

台阶

  • 拆分字符串并将其插入数组
  • 首先检查递归中的偶数对
  • 下一步将奇数对再次检查为递归
  • 检查插入到fi的值是否正确