Algorithm 查找字符串的子字符串

Algorithm 查找字符串的子字符串,algorithm,math,combinations,Algorithm,Math,Combinations,对于长度为n的字符串,计算所有子字符串的公式为:n(n+1)/2 有人能帮我直观地理解这个公式吗 维基百科说: “符号只出现一次的长度字符串的子字符串数是在符号之间选择两个不同位置以开始/结束子字符串的方法数”子字符串由其在原始字符串中的开始位置和结束位置决定。 对于任何子串,我们都有这两个端点。相反,对于字符串中的任意两个字符,正好有一个子字符串在这些点开始和结束 因此,所有子字符串的数目是所有字符对(不一定是不同的)的数目 有n*(n-1)/2对不同的字符。您还需要添加非不同的对,它们是n

对于长度为n的字符串,计算所有子字符串的公式为:n(n+1)/2 有人能帮我直观地理解这个公式吗

维基百科说:
“符号只出现一次的长度字符串的子字符串数是在符号之间选择两个不同位置以开始/结束子字符串的方法数”

子字符串由其在原始字符串中的开始位置和结束位置决定。 对于任何子串,我们都有这两个端点。相反,对于字符串中的任意两个字符,正好有一个子字符串在这些点开始和结束

因此,所有子字符串的数目是所有字符对(不一定是不同的)的数目

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


这个总和可以用自然归纳法来计算,这也是因为高斯在学校时解出了这个总和

要理解这一点,请注意任何子字符串都需要两个参数:开始索引和结束索引

例如:string str=“Hello World”//长度==11

让我们从一次只取一个字符子字符串开始:H、e、l、l、o、W、o、r、l、d。然后一次取两个字符:He、el、ll、lo、o、W、Wo或rl、ld。然后取3个字符:Hel。。等等

所以子串总数是11+10+9+..+一般来说,对于从1到n的i,我们有
n-i+1
子字符串。综上所述:


Sigma(n+1-i)从i=1到n,产生
n*(n+1)-n*(n+1)/2
,也就是
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:“美孚”开始索引“M”和结束索引“L”这是第五种可能性

步骤8:“OB”开始索引“O”和结束索引“B”这是八种可能性

步骤21:“移动”开始索引“E”和结束索引“E”这是第二十一种可能性


这些是在字符串中有子字符串的可能性,并且子字符串中的结束索引不能小于开始索引。

假设您想找出“abc”的子字符串, 那就是 {“a”、“ab”、“abc”、“b”、“bc”、“c”} 我们将通过以下代码计算它

for(int i=0;i<len;i++){
        for(int j=i;j<len;j++){

        }
    }

<代码> >(int i=0;i子串由它的两个端点定义,基本上我们可以考虑子串作为字符串的切片。 让我们用一个例子来理解它。 考虑长度为3

的字符串“ABC” a、b、c


要对字符串进行切片,我们有4个位置,从a之前到c之后的字符串末尾。从这4个可用选项中,我们必须选择2个位置来创建切片,即等于4C2==n+1C2==n*(n+1)/2的子字符串。查看此链接,其中他们讨论了公式n(n+1)/2,了解另一条信息:您是指n吗*(n+1)/2?