Pythonで文字列内の単語を縦方向(垂直)に出力する方法
はじめに
文字列 s が与えられたとき、s 内に登場する順序と同じ順序で、すべての単語を垂直方向(縦方向)に読み取る問題を考えてみましょう。結果は文字列のリストとして返され、必要に応じてスペースで埋めます。ただし、末尾のスペースは許可されません。
各単語は必ず1つの列だけに配置され、1つの列には1つの単語しか含まれません。
例えば、入力文字列が "HOW ARE YOU" の場合、出力は次のようになります。
["HAY", "ORO", "WEU"]
これは、各行を左から右へ読むことで元の単語が復元できることを意味します。
アルゴリズムの考え方
この問題を解くために、以下の手順に従います。
sをスペースで区切って文字列のリストに分割し、空の配列xを用意して、row = 0とします。s内の各単語iについて、rowをrowとiの長さのうち大きい方に更新します(=最も長い単語の長さが行数になります)。colをsの要素数(単語数)とします。空文字列で満たされた、サイズ
rowの配列ansを作成します。iを0からcol - 1まで繰り返します。j = 0とします。j < len(s[i])の間、以下を繰り返します。i - len(ans[j]) >= 1の間、ans[j]に半角スペースを連結します(列の先頭部分をスペースで埋める処理)。ans[j]にs[i][j](i番目の単語のj文字目)を連結します。jを1増やします。
最後に ans を返します。
Pythonでの実装例
それでは、実際のコードを見てみましょう。
class Solution(object):
def printVertically(self, s):
s = s.split(" ")
x = []
row = 0
for i in s:
row = max(row, len(i))
col = len(s)
ans = ["" for i in range(row)]
j = 0
for i in range(col):
j = 0
while j < len(s[i]):
while i - len(ans[j]) >= 1:
ans[j] += " "
ans[j] += s[i][j]
j += 1
return ans
ob = Solution()
print(ob.printVertically("HOW ARE YOU"))
print(ob.printVertically("TO BE OR NOT TO BE"))入力例
"HOW ARE YOU" "TO BE OR NOT TO BE"
出力結果
["HAY","ORO","WEU"] ["TBONTB","OEROOE"," T"]
処理のポイント
このアルゴリズムの重要なポイントは以下の通りです。
行数の決定: 最も長い単語の長さが、出力リストの要素数(行数)になります。
スペースの補完: 単語が短い場合、その位置より前の行ではスペースで埋める必要があります。これにより、各列の文字が正しく縦に揃います。
末尾スペースの除去: 各行の末尾には余分なスペースが残らないように、文字を追加するタイミングで制御しています。
計算量は、単語数を C、最長単語の長さを R とすると O(C × R) となり、効率的に処理できます。
-
Pythonでパターンを出力する方法|三角形・数字・アルファベット・ピラミッドのコード例
Pythonでパターンを出力するには、ネストされた(入れ子構造の)forループを使用します。外側のループで行数を制御し、内側のループで列数を処理します。そしてprint文を工夫することで、目的に応じたさまざまなパターンを作成できます。パターンには、星(アスタリスク)パターン、数字パターン、アルファベットパターンなどがあり、三角形やピラミッドなど、さまざまな形状にも対応できます。パターン出力の基本これらのパターンは、print文を少し変更しながらforループを組み合わせることで出力できます。基本的な考え方はどのパターンも共通しており、違いはごくわずかです。ここからは、代表的なパターンのコードを実
-
文字列の中から偶数の長さの単語を出力するPythonプログラム
本記事では、与えられた問題を解決するための考え方と実装方法について解説します。Pythonの基本的な文字列操作を組み合わせることで、初心者の方でも簡単に実装できる内容となっています。 問題文 文字列が与えられたとき、その中に含まれる単語のうち、文字数が偶数であるものをすべて画面に表示するプログラムを作成します。 例えば、「tutorial point」という文字列が入力された場合、「tutorial」は8文字(偶数)なので出力され、「point」は5文字(奇数)なので出力されません。 解決のアプローチ この問題は、以下の手順で解決できます。 split()関数を使って、入力文字列を空白区切り