对于长度为n的字符串,计算所有子字符串的公式为:n(n + 1)/ 2 有人能帮助我直观地理解这个公式吗?
维基百科说: “符号只出现一次的长度字符串的子串数,是在符号之间选择两个不同位置以开始/结束子字符串的方式的数量”
答案 0 :(得分:33)
要理解这一点,请注意,任何子字符串都需要两个参数:start index和end index。
例如:string str =“Hello World”; // length == 11
让我们从时间上只取一个字符的子字符串开始:H,e,l,l,o,,W,o,r,l,d。然后在时间上取2个字符:He,el,ll,lo,o,W,Wo,或rl,ld。然后通过3个字符:Hel,..等。
所以总子串数是11 + 10 + 9 + .. + 1,一般来说,for i from 1 to n
,我们有n - i + 1
个子串。通过总结:
Sigma(n + 1 - i)从i = 1到n,得到n * (n + 1) - n * (n + 1) / 2
,即n * (n + 1) / 2
答案 1 :(得分:4)
子字符串由它开始的位置以及它在原始字符串中的结束位置决定。 对于任何子字符串,我们都有这两个端点。相反,对于字符串中的任何两个字符,只有一个子字符串在这些点处开始和结束。
因此,所有子串的数量是所有(不是必需的)不同字符对的数量。
有n*(n-1)/2
对不同的字符。您还需要添加非独特的对,即n。
所以总数是n * (n-1) / 2 + n = n * (n+1) / 2
。
答案 2 :(得分:1)
嗯,它是长度为1(正好为n)的所有子串的总和, 加上所有长度为2(n-1)的子串, 加上所有长度为n的子串(这是一个合适的字符串)。然后,你有n + n-1 + n-2 ... + 1 =(n *(n + 1))/ 2
总和可以使用自然归纳来计算,并且由于高斯在他上学时解决了这笔总和,因此也是已知的。
答案 3 :(得分:1)
我不擅长数学,但是substrings
的字符串是什么,获得substrings
字符串的可能性是什么,我会试着解释一下。
让我们举一个例子:“MOBILE”这是一个由6个字符组成的字符串,现在根据你的公式 n(n + 1)/ 2,结果为6(6 + 1)/ 2 = 21
因此子字符串是在整个字符串之间具有起始索引和结束索引的任何字符串。
字符串“MOBILE”中的以下是我们可以拥有的子字符串:
步骤1:“M”开始索引“M”,结束索引“M”这是一种可能性
步骤2:“MO”开始索引“M”和结束索引“O”这是第二种可能性
第5步:“MOBIL”开始索引“M”,结束索引“L”这是第五种可能性
步骤8:“OB”开始索引“O”和结束索引“B”这是八种可能性
步骤21:“MOBILE”开始索引“E”和结束索引“E”这是第二十一种可能性
这些是在字符串中使用子字符串并且在子字符串结束索引中的可能性不能小于起始索引。
答案 4 :(得分:1)
子字符串是由两个端点定义的,基本上我们可以将子字符串视为字符串的切片。 让我们通过一个例子来理解它。 考虑长度为3的字符串“ abc”
a b c
要对字符串进行切片,我们有4个位置,从a的开始到字符串的末尾,再到c之后的字符串。从这4个可用选项中,我们必须选择2个位置来创建切片,即等于 4 < / sup> C 2 == n + 1 C 2 == n *(n + 1)/ 2
答案 5 :(得分:0)
假设您要查找&#34; abc&#34;的子字符串, 那会是 {&#34;&#34;&#34; AB&#34;&#34; ABC&#34;&#34; B&#34;&#34; BC&#34;&#34; C&#34;} 我们将通过以下代码计算它
for(int i=0;i<len;i++){
for(int j=i;j<len;j++){
}
}
查看此代码,很容易判断循环是否以
运行第一次运行3次 第二次运行2次,第3次运行1次
因为它每次返回一个子字符串,因此 等于n 的总和 那是= n(n + 1)/ 2
答案 6 :(得分:-2)
n *(n + 1)/ 2是从1到n的数字之和。
如果n = 4,则4 *(4 + 1)/ 2 = 10。
希望这有帮助。