Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonのさまざまなクエリの文字列のさまざまなサブ文字列の数を見つけるプログラム


長さがnの文字列sがあるとします。クエリQのリストもあります。ここで、Q [i]にはペア(l、r)が含まれています。クエリごとに、lからrまでの包括的範囲内のsの異なるサブストリングの数をカウントする必要があります。

したがって、入力がs ="ppqpp" Q =[(1,1)、(1,4)、(1,1)、(0,2)]の場合、出力は[1,8、 1,5]なぜなら

  • クエリ(1、1)の場合、部分文字列は「p」のみであるため、出力は1です

  • クエリ(1、4)の場合、部分文字列は'p'、'q'、'pq'、'qp'、'pp'、'pqp'、'qpp'、および'pqpp'であるため、出力は8

  • ここでもクエリ(1、1)の場合、部分文字列は「p」のみであるため、出力は1です

  • クエリ(0、2)の場合、サブ文字列は「p」、「q」、「pp」、「pq」、「ppq」であるため、出力は8です。

これを解決するには、次の手順に従います-

  • 関数kasai()を定義します。これにはs、suff、nが必要です
  • lcp:=サイズnの配列で、0で埋めます
  • inv:=サイズnの配列で、0で埋めます
  • 0からn-1の範囲のiの場合、do
    • inv [suff [i]]:=i
  • k:=0
  • 0からn-1の範囲のiの場合、do
    • inv [i]がn-1と同じ場合、
      • k:=0
      • 次の反復に進む
    • j:=suff [inv [i] + 1]
    • i +k
    • k:=k + 1
  • lcp [inv [i]]:=k
  • k> 0の場合、
    • k:=k-1
  • lcpを返す
  • メインの方法から、次の手順を実行します-
  • res:=新しいリスト
  • 範囲0からQ-1のサイズのiの場合、実行
    • (左、右):=Q [i]
    • sub:=インデックスの左から右へのsの部分文字列
    • 長さ:=右-左+ 1
    • 接尾辞:=範囲0から長さ-1の各iのペアのリスト(i、インデックスiから終了までのsubのサブストリング)
    • ペアの部分文字列の2番目の項目に基づいてサフィックスを並べ替えます
  • (suff、suffix)=サフィックスからのインデックスと対応するサブストリングのペア
    • lcp:=kasai(sub、suff、length)
    • count:=サフィックスのサイズ[0]
    • 0から長さ2の範囲のiの場合は、
      • count:=count+サフィックスのサイズ[i+1] --lcp [i]
    • 解像度の最後にカウントを挿入
  • return res
  • 理解を深めるために、次の実装を見てみましょう-

    def kasai (s, suff, n):
       lcp = [0] * n
       inv = [0] * n
       for i in range (n):
          inv [suff [i]] = i
       k = 0
       for i in range (n):
          if inv [i] == n-1:
             k = 0
             continue
          j = suff [inv [i] + 1]
          while i + k <n and j + k <n and s [i + k] == s [j + k]:
             k += 1
          lcp [inv [i]] = k
          if k> 0:
             k -= 1
       return lcp
    
    def solve(s, Q):
       res = []
       for i in range (len(Q)):
          left, right = Q[i]
          sub = s [left: right + 1]
          length = right-left + 1
    
          suffix = [[i, sub [i:]] for i in range (length)]
    
          suffix.sort (key = lambda x: x [1])
          suff, suffix = [list (t) for t in zip (* suffix)]
    
          lcp = kasai (sub, suff, length)
          count = len (suffix [0])
          for i in range (length-1):
             count += len (suffix [i + 1]) - lcp [i]
    
          res.append(count)
       return res
    
    s = "pptpp"
    Q = [(1,1),(1,4),(1,1),(0,2)]
    print(solve(s, Q))

    入力

    "pptpp", [(1,1),(1,4),(1,1),(0,2)]
    

    出力

    [1, 8, 1, 5]

    1. 数の因子の最小合計を見つけるためのPythonプログラム

      この記事では、以下に示す問題ステートメントの解決策について学習します- 問題の説明 入力された数値を指定して、指定された数値の因子の最小合計を求めます。 ここでは、すべての因子とそれに対応する合計を計算し、それらの中から最小値を見つけます。 したがって、数の積の最小合計を見つけるために、積の素因数の合計を見つけます。 これが問題の反復実装です- 例 #iterative approach def findMinSum(num):    sum_ = 0    # Find factors of number and add to the sum

    2. 数の最大の素因数を見つけるためのPythonプログラム

      この記事では、以下に示す問題ステートメントの解決策について学習します- 問題の説明 正の整数nが与えられます。数の最大の素因数を見つける必要があります。 アプローチ 指定された数値を数値の約数で割って因数分解します。 最大素因数を更新し続けます。 例 import math def maxPrimeFactor(n):    # number must be even    while n % 2 == 0:       max_Prime = 2       n /= 1