Pythonのsの個別の部分文字列の数をカウントするプログラム
文字列sがあるとすると、sの個別の空でない部分文字列の数を見つける必要があります。
したがって、入力がs ="abaa"の場合、サブストリングは["a"、 "b"、 "ab"、 "ba"、 "aa"、 "aba"、 "であるため、出力は8になります。 baa "、"abaa"]。
これを解決するには、次の手順に従います-
- トライ:=新しい地図
- n:=sのサイズ
- 0からn-1の範囲のiの場合、do
- curr:=trie
- iからn-1の範囲のjの場合、do
- c:=s [j]
- cがcurrにない場合は、
- curr [c]:=新しいマップ
- curr:=curr [c]
- curr ["*"]:=True
- q:=キューを作成し、トライを挿入します
- ans:=0
- qが空ではない場合は、
- ans:=ans + 1
- t:=qのアイテムを残し、このアイテムをqから削除します
- tのcごとに、
- cが"*"と同じでない場合、
- qの最後にt[c]を挿入します
- cが"*"と同じでない場合、
- return ans-1
例
理解を深めるために、次の実装を見てみましょう-
from collections import deque
def solve(s):
trie = {}
n = len(s)
for i in range(n):
curr = trie
for j in range(i, n):
c = s[j]
if c not in curr:
curr[c] = {}
curr = curr[c]
curr["*"] = True
q = deque([trie])
ans = 0
while q:
ans += 1
t = q.popleft()
for c in t:
if c != "*":
q.append(t[c])
return ans - 1
s = "abaa"
print(solve(s)) 入力
"abaa"
出力
8
-
Pythonで各ブラケットの深さの文字数をカウントするプログラム
「X」、「(」、および「)」の3文字のみで構成される文字列sがあるとします。文字列にはバランスの取れた角かっこがあり、いくつかの「X」の間に入れ子になった角かっこが再帰的に存在する可能性があります。ブラケットの各深さで、最も浅い深さから最も深い深さまで、「X」の数を見つける必要があります。 したがって、入力がs =(XXX(X(XX))XX)のような場合、出力は[5、1、2]になります。 これを解決するには、次の手順に従います- 深さ:=-1 out:=新しいリスト sの各cについて、 cが(と同じ場合、 深さ:=深さ+ 1 それ以外の場合、cが )と同じ場合、 深度
-
PythonでnノードのBSTの数をカウントするプログラム
n個の異なるノードがあるとします。すべてが異なります。二分探索木を形成するためにそれらを配置できる方法の数を見つける必要があります。二分探索木で知っているように、左側のサブツリーは常に小さい値を保持し、右側のサブツリーは大きい値を保持します。 これを解決するために、カタラン数を見つけます。カタラン数C(n)は、n個の異なるキーを持つ二分探索木を表します。式は次のようになります $$ C(n)=\ frac {(2n)!} {(n + 1)!\ times n!} $$ したがって、入力がn =3の場合、出力は5になります。 これを解決するには、次の手順に従います- 関数ncr