Pythonでバイナリ文字列内のすべての「1」が等間隔に並んでいるか判定する方法
バイナリ文字列 s が与えられたとき、文字列中のすべての「1」が等間隔(等距離)に配置されているかどうかを判定する問題です。言い換えると、隣接する任意の2つの「1」の間の距離がすべて同じである必要があります。なお、文字列には少なくとも2つの「1」が含まれているものとします。
たとえば、入力が s = "100001000010000" の場合、「1」同士の間隔はいずれも4で一定であるため、出力は True になります。
解法のアプローチ
この問題は、以下の手順で解くことができます。
- 「1」が出現する位置(インデックス)を格納するための新しいリスト
indexを用意します。 - i を 0 から文字列
sの長さまで順に走査し、s[i]が '1' であれば、その位置iをリストindexの末尾に追加します。 - 変数
tにリストindexのサイズを代入します。 - i を 1 から
t - 1まで繰り返し、(index[i] - index[i - 1])が最初の間隔(index[1] - index[0])と一致しない場合はFalseを返します。 - ループが最後まで完了すれば、すべての間隔が等しいことになるため
Trueを返します。
それでは、理解を深めるために実際の実装例を見てみましょう。
実装例
def solve(s):
index = []
for i in range(len(s)):
if s[i] == '1':
index.append(i)
t = len(index)
for i in range(1, t):
if (index[i] - index[i - 1]) != (index[1] - index[0]):
return False
return True
s = "100001000010000"
print(solve(s))入力
"100001000010000"
出力
True
計算量について
このアルゴリズムでは、まず文字列を一度走査して「1」の位置を収集するのに O(n) の時間がかかり、その後の間隔チェックでも最大 O(n) の処理が必要です。したがって、全体の時間計算量は O(n) となり、空間計算量も「1」の位置を保存するリストの分だけ O(n) となります(n は文字列の長さ)。文字列を1回の走査で済ませるシンプルかつ効率的なアプローチと言えます。
-
Pythonで二分木のすべてのノードの値が同じかどうかをチェックするプログラム
問題の概要二分木が与えられたとき、その木に含まれるすべてのノードが同じ値を持っているかどうかを判定することを考えます。例えば、次のような二分木が入力として与えられた場合、すべてのノードが同じ値を持っているため、出力は True になります。解決のアプローチこの問題は、再帰を使ってシンプルに解くことができます。以下の手順に従います。solve() 関数を定義します。この関数は root(現在のノード)と val(比較対象の値)を引数として受け取ります。root が null(None)の場合は、True を返します。空の部分木は条件を満たしているとみなせるためです。val が未定義の場合は、ro
-
文字列が空かどうかをチェックするPythonプログラム
この記事では、与えられた文字列が空であるかどうかを判定するための解決策とアプローチについて解説します。 問題文 文字列が入力として与えられたとき、その文字列が空(空文字列)であるかどうかを判定する必要があります。 Pythonの文字列はイミュータブル(変更不可)な性質を持っているため、文字列に対して何らかの操作を行う際には注意して扱う必要があります。 ここでは、上記の問題を解決するための2つのアプローチを紹介します。 len()メソッドを使用する方法 等価演算子(==)を使用する方法 アプローチ1:len()メソッドを使う方法 len()関数で文字列の長さを取得し、その長さが0であれば空文