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

Pythonで文字列のn番目の辞書式順列を検索する


長さがmの文字列があり、この文字列に小文字のみが含まれているとすると、辞書式順序で文字列のn番目の順列を見つける必要があります。

したがって、入力がstring ="pqr"、n =3の場合、すべての順列が[pqr、prq、qpr、qrp、rpq、rqp]であるため、出力は "qpr"になり、並べ替えられた順序になります。

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

  • MAX_CHAR:=26

  • MAX_FACT:=20

  • 階乗:=サイズMAX_FACTの配列

  • 階乗[0]:=1

  • 1からMAX_FACTの範囲のiの場合、実行

    • factorials [i]:=factorials [i-1] * i

  • サイズ:=文字列のサイズ

  • オカレンス:=サイズMAX_CHARの配列、0で埋める

  • 0からサイズの範囲のiの場合、実行

    • オカレンス[ASCIIof(string [i])-ASCII of('a')]:=オカレンス[ASCII of(string [i])-ASCII of('a')] + 1

  • res:=サイズMAX_CHARの配列

  • 合計:=0、k:=0

  • Sumはnと同じではありませんが、実行してください

    • 合計:=0

    • 0からMAX_CHARの範囲のiの場合、実行

      • オカレンス[i]が0と同じ場合、

        • 次のイテレーションに行く

      • オカレンス[i]:=オカレンス[i]-1

      • temp_sum:=階乗[サイズ-1-k]

      • 0からMAX_CHARの範囲のjについては、次のようにします

        • temp_sum:=temp_sum / factorials [occurrence [j]](整数除算)

      • Sum:=Sum + temp_sum

      • Sum> =nの場合、

        • res [k]:=ASCIIコードからの文字(i + ASCII of('a'))

        • n:=n-合計-temp_sum

        • k:=k + 1

        • ループから出てきます

      • Sum

        • オカレンス[i]:=オカレンス[i] + 1

  • i:=MAX_CHAR-1

  • k<サイズおよびi>=0の場合、実行

    • オカレンス[i]がゼロ以外の場合、

      • res [k]:=ASCIIコードからの文字(i + ASCII of('a'))

      • オカレンス[i]:=オカレンス[i]-1

      • i:=i + 1

      • k:=k + 1

    • i:=i-1

  • インデックス0から(k-1)までのresからmake文字列を返します

理解を深めるために、次の実装を見てみましょう-

MAX_CHAR = 26
MAX_FACT = 20
factorials = [None] * (MAX_FACT)
def get_nth_permute(string, n):
   factorials[0] = 1
   for i in range(1, MAX_FACT):
      factorials[i] = factorials[i - 1] * i
   size = len(string)
   occurrence = [0] * (MAX_CHAR)
   for i in range(0, size):
      occurrence[ord(string[i]) - ord('a')] += 1
   res = [None] * (MAX_CHAR)
   Sum = 0
   k = 0
   while Sum != n:
      Sum = 0
      for i in range(0, MAX_CHAR):
         if occurrence[i] == 0:
            continue
         occurrence[i] -= 1
         temp_sum = factorials[size - 1 - k]
         for j in range(0, MAX_CHAR):
            temp_sum = temp_sum // factorials[occurrence[j]]
         Sum += temp_sum
         if Sum >= n:
            res[k] = chr(i + ord('a'))
            n -= Sum - temp_sum
            k += 1
            break
         if Sum < n:
            occurrence[i] += 1
   i = MAX_CHAR-1
   while k < size and i >= 0:
      if occurrence[i]:
         res[k] = chr(i + ord('a'))
         occurrence[i] -= 1
         i += 1
         k += 1
      i -= 1
   return ''.join(res[:k])

n = 3
string = "pqr"
print(get_nth_permute(string, n))

入力

"pqr"

出力

qpr

  1. Pythonでの次の順列

    次の順列メソッドを実装したいとします。そのメソッドは、辞書式順序で次に大きい数の順列に数値を再配置します。そのような配置が不可能な場合、このメソッドはそれを可能な限り低い順序として再配置します(つまり、実際には昇順でソートされます)。交換はインプレースで行う必要があり、余分なメモリを使用しないでください。たとえば、入力が左側の列にあり、対応する出力が右側の列にある場合。 1,2,3 → 1,3,2 3,2,1 → 1,2,3 1,1,5 → 1,5,1 手順を見てみましょう- found:=false、i:=配列の長さ– 2 =0 A [i]

  2. 2つの文字列から珍しい単語を見つけるPythonプログラム

    この記事では、以下に示す問題ステートメントの解決策について学習します。 問題の説明 − 2つの文字列が与えられているので、与えられた文字列から珍しい単語を取得する必要があります。 次に、以下の実装のソリューションを見てみましょう- 例 # uncommon words def find(A, B):    # count    count = {}    # insert in A    for word in A.split():       count[word] = coun