Pythonで各方向が4分の1回発生するように、方向文字列のバランスをとるプログラム
北、南、西、東にそれぞれ「N」、「S」、「W」、「E」の4つの方向を持つ文字列sがあるとします。 4つの方向のそれぞれがそれぞれn/4回発生するように、更新できる最短のサブストリングのサイズを見つける必要があります。ここで、nはストリングsのサイズです。
したがって、入力がs ="NNSWWESN"の場合、出力は1になり、ここではnは8になり、8/4は2になります。したがって、最後のNをEに変更すると、すべての方向が2回存在します。
これを解決するには、次の手順に従います-
- n:=sのサイズ
- nが0の場合、
- 0を返す
- クォーター:=(n / 4)のフロア
- count:=sに存在する各要素の頻度を含むリスト
- target:=新しいマップ
- カウントの各ペア(dir、cnt)について、実行します
- cnt>四半期の場合、
- target [dir]:=Quarter --cnt
- cnt>四半期の場合、
- ターゲットが空の場合、
- 0を返す
- 左:=0
- min_len:=inf
- sの各インデックスの右方向と方向方向について、次のようにします。
- dirがターゲットにある場合、
- target [dir]:=target [dir] + 1
- ターゲットのすべての値のリストの最小値>=0である間、実行
- min_len:=min_lenの最小値と(右-左+ 1)
- ターゲットにs[left]がある場合、
- target [s [left]]:=target [s [left]]-1
- 左:=左+ 1
- dirがターゲットにある場合、
- return min_len
例
理解を深めるために、次の実装を見てみましょう-
from collections import Counter
def solve(s):
n = len(s)
if not n:
return 0
quarter = n // 4
count = Counter(s)
target = dict()
for (dir, cnt) in count.items():
if cnt > quarter:
target[dir] = quarter - cnt
if not target:
return 0
left, min_len = 0, float("inf")
for right, dir in enumerate(s):
if dir in target:
target[dir] += 1
while min(target.values()) >= 0:
min_len = min(min_len, right - left + 1)
if s[left] in target:
target[s[left]] -= 1
left += 1
return min_len
s = "NNSWWESN"
print(solve(s)) 入力
"NNSWWESN"
出力
1
-
文字列が空かどうかをチェックするPythonプログラム
この記事では、特定の問題ステートメントを解決するための解決策とアプローチについて学習します。 問題の説明 文字列を入力したら、文字列が空かどうかを確認する必要があります。 Python文字列は本質的に不変であるため、操作を実行するときは、文字列を処理するときに注意が必要です。 ここでは、上記の問題ステートメントを解決するための2つのアプローチについて説明します- len()メソッドを使用します。 等式演算子を使用します。 アプローチ1:len()メソッドを使用する 例 test_str1 = "" test_str2 = "@@@" if(l
-
指定された文字列がパングラムであるかどうかを確認するPythonプログラム
この記事では、特定の問題ステートメントを解決するための解決策とアプローチについて学習します。 問題の説明 文字列入力が与えられた場合、その文字列がパングラムであるかどうかを確認するPythonプログラムを生成する必要があります。 パングラムは、英語のアルファベットコレクションのすべての文字を含む文/一連の単語です。 では、問題を解決する方法を見てみましょう 入力文字列に存在する各文字が、手動で宣言するアルファベットセットに属しているかどうかをチェックするループを使用します。 上記のアプローチの実装は、-によって与えられます。 例 import string def ispangram