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

Pythonで文字列を半単調にするために必要な更新の数を見つけるプログラム


長さが偶数の小文字の文字列があるとします。すべてのiについて次の3つの条件のいずれかが満たされるように、更新する必要のある最小文字数を見つける必要があります。ここで、0≤i>

  • s [i]> s [j]
  • s [i]
  • s [i] ==s [j]

したがって、入力がs ="pppxxp"の場合、最後の"p"を"x"に変更すると、条件s [i]

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

  • n:=sのサイズ
  • left:=sの左半分からの各文字の頻度を含む辞書
  • right:=sの右半分からの各文字の頻度を含む辞書
  • ans:=n
  • 小文字の英字でピボットする各文字について、
    • ans:=最小のansおよび(n-左[ピボット]-右[ピボット])
    • good:=(c<=ピボットの場合は左の各cのleft[c])に存在するすべての要素の合計
    • good:=good + c>ピボットの場合、右の各cについてright[c]に存在するすべての要素の合計
    • ans:=最小のansおよび(n-良い)
    • good:=c>ピボットの場合、左の各cのleft[c]に存在するすべての要素の合計
    • good:=good + c <=ピボットの場合、右の各cについてright[c]に存在するすべての要素の合計
    • ans:=最小のansおよび(n-良い)
  • 回答を返す

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

from collections import Counter
from string import ascii_lowercase
def solve(s):
   n = len(s)
   left = Counter(s[: n >> 1])
   right = Counter(s[n >> 1 :])

   ans = n
   for pivot in ascii_lowercase:
      ans = min(ans, n - left[pivot] - right[pivot])

      good = sum(left[c] for c in left if c <= pivot)
      good += sum(right[c] for c in right if c > pivot)
      ans = min(ans, n - good)

      good = sum(left[c] for c in left if c > pivot)
      good += sum(right[c] for c in right if c <= pivot)
      ans = min(ans, n - good)

   return ans

s = "pppxxp"
print(solve(s))

入力

"pppxxp"

出力

1

  1. Pythonで交差する行数を見つけるプログラム

    (m、c)のペアの値を含むリストが与えられたとします。これらの値は線を表します。ここで、y =mx+cです。また、lとrの2つの値が与えられます。 x=lからx=hの範囲で互いに交差する線の数を見つける必要があります。 したがって、入力がinput_list =[[4、6]、[-6、10]、[8、12]]、l =0、h =2の場合、出力は2になります。 与えられた写真を見ると、4x + 6=0と-6x+10の線が与えられた範囲内で交差しています。したがって、交差する2つの線があるため、出力は2になります。 これを解決するには、次の手順に従います- seg:=インデックスiのペア

  2. カットされたキューブの数を調べるPythonプログラム

    次元a、b、およびcのいくつかの立方体があり、それらを使用して、次元axbxcの新しいボックスが作成されたとします。 a、b、およびcは互いに素です。 gcd(a、b)=gcd(b、c)=gcd(c、d)=1.図に示すように、ボックスを1つのスライスで2つに切断する必要があります。箱がこのようにカットされているかどうか、いくつの立方体が2つのピースにカットされているかを確認する必要があります。可能な3次元を含む配列が提供されており、そこから答えを見つける必要があります。 カットは、頂点P、Q、およびRを通過する平面になるようにこのように行われます。 したがって、入力がn =3、inp