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