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

Pythonで1回0フリップした後、バイナリ文字列で1が含まれる最長の部分文字列の長さを検索するプログラム


バイナリ文字列sがあるとします。最大で1つの「0」から「1」に反転できます。連続する最長の1の部分文字列の長さを見つける必要があります。

したがって、入力がs ="1010110001"の場合、出力は4になります。たとえば、インデックス3にあるゼロを反転すると、文字列 "1011110001"が得られます。ここで、1の最長の部分文字列の長さは4です。 。

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

  • n:=sのサイズ
  • ans:=0、ones:=0、left:=0、right:=0
  • 正しい
  • s[right]が"1"と同じ場合、
    • ones:=ones + 1
  • 右-左+1-もの>1、実行
    • 削除:=s[左]
    • removeが「1」と同じ場合、
      • ones:=ones-1
    • 左:=左+ 1
  • ans:=ansの最大値と(右-左+ 1)
  • 右:=右+1
  • 回答を返す
  • 理解を深めるために、次の実装を見てみましょう-

    def solve(s):
       n = len(s)
       ans = ones = left = right = 0
       while right < n:
          if s[right] == "1":
             ones += 1
          while right - left + 1 - ones > 1:
             remove = s[left]
             if remove == "1":
                ones -= 1
             left += 1
          ans = max(ans, right - left + 1)
          right += 1
       return ans
    
    s = "1010110001"
    print(solve(s))

    入力

    "1010110001"

    出力

    4

    1. Pythonでバイナリツリーの最長の連続パスの長さを見つけるプログラム

      二分木があるとしましょう。二分木で最長のパスを見つける必要があります。 したがって、入力が次のような場合 連続する最長のシーケンスが[2、3、4、5、6]であるため、出力は5になります。 これを解決するには、次の手順に従います- rootがnullの場合、 0を返す maxPath:=0 関数helper()を定義します。これはノードを取ります inc:=1、dec:=1 ノードの左側がnullでない場合、 [left_inc、left_dec]:=ヘルパー(ノードの左側) それ以外の場合、 [left_inc、left_dec]:=[0、0] ノード

    2. Pythonで二分木の最長交互パスの長さを見つけるプログラム

      二分木があるとすると、左と右の子を交互に繰り返して下る最長のパスを見つける必要があります。 したがって、入力が次のような場合 交互のパスが[2、4、5、7、8]であるため、出力は5になります。 これを解決するには、次の手順に従います。 rootがnullの場合、 0を返す 関数dfs()を定義します。これには、ノード、カウント、フラグが必要です ノードがnullでない場合、 フラグがTrueと同じ場合、 a:=dfs(ノードの左側、カウント+ 1、False) b:=dfs(ノードの右側、1、True) それ以外の場合、フラグがFalseと同じ場合、 a:=dfs