String 计算不带循环或递归的字符串的所有子字符串中的字符总数
类似于String 计算不带循环或递归的字符串的所有子字符串中的字符总数,string,String,类似于ADAM的字符串具有以下子字符串 A AD ADA ADAM D DA DAM A AM M 要计算子字符串的总数,我可以执行如下的O(1)操作ADAM->10 function calcNumSubstrings(strlen) { return (strlen * (strlen + 1) / 2); } 我需要的是所有这些子字符串中所有字符的总和。在ADAM的情况下,这是20。为了得到这个,我可以做一个O(N)操作,如下所示: function calcTotalLetter
ADAM
的字符串具有以下子字符串
A
AD
ADA
ADAM
D
DA
DAM
A
AM
M
要计算子字符串的总数,我可以执行如下的O(1)操作ADAM->10
function calcNumSubstrings(strlen) {
return (strlen * (strlen + 1) / 2);
}
我需要的是所有这些子字符串中所有字符的总和。在ADAM
的情况下,这是20
。为了得到这个,我可以做一个O(N)操作,如下所示:
function calcTotalLettersInAllSubstrings(strlen) {
let total = 0;
for (let i = 1; i <= strlen; i++) {
total += calcNumSubstrings(i);
}
return total;
}
函数calctotallettersinallsubstring(strlen){
设total=0;
对于(设i=1;i一般情况为:n*(n+1)*(n+2)/6
其中n
是字符串中的字符数
所以在这种情况下,字符数是4:4*(4+1)*(4+2)/6=20
一般情况是:n*(n+1)*(n+2)/6
其中n
是字符串中的字符数
因此,在本例中,字符数为4:4*(4+1)*(4+2)/6=20
只要做一些数学运算。让n为字符串的长度,让sum(expr)为给定表达式的r=1到r=n的和,那么对于给定的子字符串长度r,您有(n+1-r)个可能的子字符串,因此:
sum(r(n+1-r)) = (n+1)sum(r) - sum(r^2)
现在参考标准级数和,它给出:
sum(r) = n(n+1)/2
sum(r^2) = n(n+1)(2n+1)/6
因此:
sum(r(n+1-r)) = n(n+1)^2 / 2 - n(n+1)(2n+1)
检查n=4
sum(r(5-r)) = 50 - 30 = 20
简化此表达式可得到:
sum(r(n+1-r)) = n(n+1)/2( (n+1) - (2n+1)/3)
= n(n+1)/6( 3n+3 -2n -1)
= n(n+1)(n+2)/6
如上所述,只需做一些数学运算。设n为字符串的长度,设sum(expr)为给定表达式的r=1到r=n的和,则对于给定的子字符串长度r,您有(n+1-r)个可能的子字符串,因此:
sum(r(n+1-r)) = (n+1)sum(r) - sum(r^2)
现在参考标准级数和,它给出:
sum(r) = n(n+1)/2
sum(r^2) = n(n+1)(2n+1)/6
因此:
sum(r(n+1-r)) = n(n+1)^2 / 2 - n(n+1)(2n+1)
检查n=4
sum(r(5-r)) = 50 - 30 = 20
简化此表达式可得到:
sum(r(n+1-r)) = n(n+1)/2( (n+1) - (2n+1)/3)
= n(n+1)/6( 3n+3 -2n -1)
= n(n+1)(n+2)/6
如上所述@WaldoBronchart,别忘了标记为已回答!:)老实说,我知道足够多的代数知识,可以将每个块内的除以2简化为外部块上的一个除法-之后,我只是快速查找这些项的序列是如何求和的!接受@4thamigo_uk的答案,因为它涉及到“级数和”的一般问题。谢谢你的帮助。@WaldoBronchart,没问题。我想这是英国第四大商学院应得的!:)@WaldoBronchart,别忘了按回答做标记!:)说实话,我知道足够多的代数知识,可以将每个块内的除2简化为外部块上的一个除-之后,我很快就查到了序列是如何计算的这些术语的数量是总和!接受了@4thamigo_-uk的答案,因为它涉及到“级数之和”的一般问题。谢谢你的帮助。@WaldoBronchart,没问题。我认为4thamigo_-uk赢得了它!:)