对于长度为n的字符串,计算所有子串的公式为:n(n+1)/2。
有人能帮我直观地理解一下这个公式吗?
维基百科上说:"长度为n且符号仅出现一次的字符串的子串数量,是选择两个不同位置作为子串起始或结束位置的方式数目。"
对于长度为n的字符串,计算所有子串的公式为:n(n+1)/2。
有人能帮我直观地理解一下这个公式吗?
维基百科上说:"长度为n且符号仅出现一次的字符串的子串数量,是选择两个不同位置作为子串起始或结束位置的方式数目。"
n *(n-1)/ 2
个不同字符对。您还需要添加非不同对,即为n个。n *(n + 1)/ 2
。嗯,它是所有长度为1的子字符串(恰好为n)的总和,再加上所有长度为2的子字符串(n-1),再加上所有长度为n的子字符串(即正确的字符串)。然后,您有n + n-1 + n-2 ... + 1 =(n *(n + 1))/ 2。
可以使用自然归纳法计算总和,这也是由高斯在他上学时解决的问题。
为了切割该字符串,我们有4个位置,从a之前到c之后的字符串末尾。从这4个可用选项中,我们必须选择2个位置来创建一个切片,即一个等于4C2 == n+1C2==n*(n+1)/2的子字符串。a b c
for(int i=0;i<len;i++){
for(int j=i;j<len;j++){
}
}
看着这段代码,很容易发现循环运行次数如下:
第一次运行3次, 第二次运行2次,第三次运行1次
由于每次都返回一个子字符串,因此它等于n的总和,即n(n + 1) / 2
我不擅长数学,但是什么是字符串的子串,以及获取字符串子串的可能性,我会尝试向您解释。
让我们举个例子:“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”,这是第二十一种可能性。
这些是在字符串中具有子字符串的可能性,在子字符串中,结束索引不能小于开始索引。