web-dev-qa-db-ja.com

文字列の部分文字列を見つける

長さnの文字列の場合、すべての部分文字列を計算する式は次のとおりです。n(n + 1)/ 2誰かがこの式を直感的に理解するのを手伝ってくれますか?

ウィキペディアによると:「記号が1回だけ出現する長さの文字列の部分文字列の数は、部分文字列を開始/終了するために記号間の2つの異なる場所を選択する方法の数です」

12

これを理解するには、部分文字列には開始インデックスと終了インデックスの2つのパラメータが必要であることに注意してください。

例:string str = "Hello World"; //長さ== 11

一度に1文字の部分文字列のみを取ることから始めましょう:H、e、l、l、o 、、 W、o、r、l、d。次に、一度に2文字を取ることによって:He、el、ll、lo、o、W、Wo、またはrl、ld。次に、3文字を取ることによって:ヘル、..など。

したがって、部分文字列の総数は11 + 10 + 9 + .. + 1であり、通常、_for i from 1 to n_には_n - i + 1_部分文字列があります。要約すると:

I = 1からnまでのシグマ(n + 1-i)は、n * (n + 1) - n * (n + 1) / 2であるn * (n + 1) / 2を生成します。

36
user586399

部分文字列は、元の文字列のどこから始まりどこで終わるかによって決まります。どの部分文字列にも、これら2つのエンドポイントがあります。逆に、文字列内の任意の2文字に対して、それらのポイントで開始および終了する部分文字列が1つだけあります。

したがって、すべての部分文字列の数は、(必ずしも区別する必要はない)文字のすべてのペアの数です。

異なる文字のn*(n-1)/2ペアがあります。また、nである個別でないペアを追加する必要があります。

したがって、総数はn * (n-1) / 2 + n = n * (n+1) / 2です。

5
Petar Ivanov

これは、長さ1(正確にn)のすべての部分文字列、長さ2(n-1)のすべての部分文字列、および長さn(適切な文字列)のすべての部分文字列の合計です。次に、n + n-1 + n-2 ... + 1 =(n *(n + 1))/ 2

合計は自然誘導を使用して計算できます。また、ガウスが学校にいたときにこの合計を解いたことからも知られています。

1
Luixv

私は数学が得意ではありませんが、文字列のsubstringsとは何ですか、また文字列のsubstringsを取得する可能性は何ですか。説明しようと思います。

例を見てみましょう。「MOBILE」これは6文字の文字列であり、式n(n + 1)/ 2によると、結果は6(6 + 1)/ 2 = 21になります。

したがって、部分文字列は、文字列全体の間に開始インデックスと終了インデックスを持つ任意の文字列です。

文字列「MOBILE」では、次の部分文字列を使用できます。

ステップ1:「M」開始インデックス「M」および終了インデックス「M」これは1つの可能性です

ステップ2:「MO」開始インデックス「M」および終了インデックス「O」これは2番目の可能性です

ステップ5:「MOBIL」開始インデックス「M」および終了インデックス「L」これは5番目の可能性です

ステップ8:「OB」開始インデックス「O」および終了インデックス「B」これは8つの可能性です

ステップ21:「MOBILE」開始インデックス「E」と終了インデックス「E」これは21番目の可能性です

これらは、文字列内に部分文字列を含める可能性であり、部分文字列内の終了インデックスは開始インデックスより小さくすることはできません。

1
FosterZ

"abc"の部分文字列、つまり{"a"、 "ab"、 "abc"、 "b"、 "bc"、 "c"}を見つけたいとすると、次のコードで計算します。

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

        }
    }

このコードを見ると、ループが次のように実行されていることが簡単にわかります。

1回目の実行で3回、2回目の実行で2回、3回目の実行で1回

毎回部分文字列を返すため、nの合計に等しい= n( n + 1)/ 2

0
Aditya