Pythonで指定した単語を組み合わせて2文字の文字列を作成できるか判定する方法
長さ2の文字列 s と、すべての要素が長さ2の単語であるリスト w があるとします。このとき、w に含まれる単語を連結してできた文字列の中に、s が部分文字列として含まれるかどうかを判定する問題です。
例えば、s = "no"、w = ["ol", "on", "ni", "to"] の場合、出力は True になります。これは、「on」+「ol」のように単語を連結すると「onol」という文字列が作れ、その中に「no」が含まれているためです。
解法のアプローチ
この問題は以下の手順で解くことができます。
- n := リスト w に含まれる単語の総数
- char_0 := False、char_1 := False として初期化
- i を 0 から n - 1 まで繰り返し処理を行う
- w[i] が s と完全に一致する場合は True を返す
- s[0](s の先頭文字)が w[i][1](w[i] の末尾文字)と一致する場合は char_0 := True にする
- s[1](s の末尾文字)が w[i][0](w[i] の先頭文字)と一致する場合は char_1 := True にする
- char_0 と char_1 が両方とも True になった場合は True を返す
- ループが終了しても条件を満たさなければ False を返す
このアルゴリズムのポイントは、ある単語の末尾文字が s の先頭文字と一致し、別の単語の先頭文字が s の末尾文字と一致していれば、その2つの単語を連結することで s を部分文字列として含む文字列を作れるという点です。計算量は O(n) となり、非常に効率的です。
それでは、実際の実装を見てみましょう。
実装例
def solve(s, w):
n = len(w)
char_0 = False
char_1 = False
for i in range(n):
if w[i] == s:
return True
if s[0] == w[i][1]:
char_0 = True
if s[1] == w[i][0]:
char_1 = True
if char_0 and char_1:
return True
return False
s = "no"
w = ["ol", "on", "ni", "to"]
print(solve(s, w))入力
"no", ["ol", "on", "ni", "to"]
出力
True
このように、リスト内の各単語を一度だけ走査することで、目的の文字列を作成可能かどうかを効率的に判定できます。単語そのものが s と一致するケースや、複数の単語を組み合わせるケースの両方に対応している点が特徴です。
-
指定された文字列がキーワードであるかどうかを確認するPythonプログラム
この記事では、指定された文字列がPythonのキーワード(予約語)であるかどうかを判定する方法について解説します。問題の概要与えられた文字列が、Pythonにおけるキーワードであるかどうかを確認する必要があります。キーワードとは、言語によって特別な用途のために予約されている単語であり、変数名や関数名などの識別子として使用することはできません。例えば「if」「for」「while」「def」などはすべてキーワードです。これらの名前を変数に使おうとすると、構文エラーが発生します。解決策:keywordモジュールの活用Pythonには標準ライブラリとしてkeywordモジュールが用意されており、これ
-
Pythonで文字列がパングラムかどうかを判定するプログラムの作成方法
本記事では、与えられた文字列がパングラムであるかどうかを判定するPythonプログラムの解法とアプローチについて詳しく解説します。 問題の概要 文字列入力が与えられたとき、その文字列がパングラムであるかどうかを判定するPythonプログラムを作成します。 パングラムとは? パングラムとは、英語のアルファベット26文字すべてを少なくとも1回ずつ含む文章や一連の単語のことです。有名な例として「The quick brown fox jumps over the lazy dog」があります。 解法のアプローチ この問題は、以下の手順で解くことができます。 アルファベット全体を表す基準となる文字列