-
Pythonでソート済み配列が合計kのペアに分割できるか判定する方法
数値の配列ともう一つの数値 k が与えられたとき、その配列を「各ペアの合計が必ず k になるように」ペアへ分割できるかどうかを判定する問題を考えます。 たとえば、入力が arr = [1, 2, 3, 4, 5, 6]、k = 7 の場合、出力は True になります。(2, 5)、(1, 6)、(3, 4) というペアを作れば、それぞれの合計がすべて 7 になるからです。 アルゴリズムの考え方 配列がすでにソートされていることを利用すると、両端から中央に向かって進める「二ポインタ(Two Pointers)」手法で効率的に判定できます。手順は以下の通りです。 n を配列の要素数とします。
-
Pythonで母音と子音の置き換えにより文字列を別の文字列に変換できるか判定する方法
2つの文字列 s と t が与えられたとします。このとき、任意の位置にある文字は、母音であれば別の母音へ、子音であれば別の子音へのみ置き換えることができます。このルールのもとで、s を t に変換できるかどうか(またはその逆)を判定するのが本記事のテーマです。 問題のポイント 例えば、入力が s = udpmva、t = itmmve の場合を考えてみましょう。 u → i(母音 → 母音) d → t(子音 → 子音) p → m(子音 → 子音) a → e(母音 → 母音) すべての位置で母音同士・子音同士の対応になっているため、出力は True となります。 解法のアプローチ この
-
Pythonで指定された制約のもと、別の文字列から目的の文字列を生成できるか判定する方法
問題の概要小文字のみで構成される2つの文字列 s と t が与えられたとします。このとき、次の制約条件に従って t を s から生成できるかどうかを判定するのが本記事の目的です。制約条件文字の一致: t に含まれる各文字は、s にも同じ個数だけ存在しなければなりません。たとえば、t に「a」が2つ含まれているなら、s にも「a」が2つ必要です。前の文字による代替: t のある文字が s に存在しない場合は、その直前の2つの文字(ASCIIコードで1つ前と2つ前の文字)が s に存在するかを確認します。たとえば、「f」が t にはあるが s にはない場合、「d」と「e」を組み合わせて「f」を作る
-
Pythonで文字列を2文字回転させて別の文字列と一致するか判定する方法
この記事では、Pythonを使って「ある文字列を左または右に2文字回転させると、もう一方の文字列と一致するかどうか」を判定する方法を解説します。問題の概要2つの文字列 s と t が与えられたとき、t を左方向または右方向のどちらかに2文字分回転させることで s が得られるかどうかを確認します。例えば、入力が s = kolkata、t = takolka の場合を見てみましょう。「takolka」を左に2文字回転させると「kolkata」になるため、出力は True となります。解決の手順この問題は以下のステップで解決できます。まず、s と t の文字数が異なる場合は、回転しても一致すること
-
Pythonで文字列を並べ替えて回文を作成できるかどうかを判定する方法
文字列が与えられたとき、その文字を並べ替えることで回文(前から読んでも後ろから読んでも同じ文字列)を作成できるかどうかを判定する問題について解説します。例えば、入力が s = aarcrce の場合、文字を並べ替えて racecar を作ることができるため、出力は True になります。考え方回文になるための条件はシンプルです。各文字の出現回数に着目すると、以下のようになります。文字列の長さが偶数の場合:すべての文字が偶数回出現する必要があります。文字列の長さが奇数の場合:ちょうど1つの文字だけが奇数回出現し、残りはすべて偶数回出現する必要があります。つまり、「奇数回出現する文字の種類数が1以
-
【Python】文字列を繰り返して別の文字列を作れるか判定する方法
2つの文字列 s と t が与えられたとします。このとき、s を何回連結すると t と同じ文字列を作れるかを求めます。s の繰り返しでは t を生成できない場合は -1 を返します。例えば、入力が s = tom、t = tomtomtom の場合、「tom」を3回連結すれば「tomtomtom」になるため、出力は 3 となります。解法のアプローチこの問題は以下の手順で解くことができます。t の長さが s の長さで割り切れない場合は、-1 を返すcnt に「t の長さ ÷ s の長さ」の商を代入するs を cnt 回繰り返して新しい文字列を作るその結果が t と一致する場合は cnt を返す一
-
Pythonで特定の部分文字列を繰り返し削除し、文字列を空にできるかどうかを判定する方法
2つの文字列 s と t があるとします。s からは t を何度でも削除できますが、1回の操作で削除できるのは1か所だけです。このとき、t を必要な回数だけ削除することで、s を完全に空の文字列にできるかどうかを判定するのが目的です。例として、s = pipipinnn、t = pin の場合を考えてみましょう。まず pipipinnn から pin を1つ削除すると pipinn になります。さらに pin を削除すると pin となり、最後にもう1度 pin を削除すれば文字列は空になります。したがって、この場合の出力は True です。解決のアプローチこの問題は、次の手順で解くことができ
-
Pythonで文字列に偶数長の回文(パリンドローム)部分文字列が含まれるかどうかを判定する方法
文字列 s が与えられたとき、その文字列の中に偶数の長さを持つ回文(パリンドローム)が含まれているかどうかを判定する問題を考えてみましょう。例えば、入力が s = afternoon の場合、出力は True になります。これは「afternoon」という文字列の中に、偶数長の回文である「noon」が含まれているためです。解き方のポイントこの問題には重要な性質があります。それは、偶数長の回文は必ず中央に「同じ文字が隣り合うペア」を持つという点です。例えば「noon」の場合、中央の2文字は「oo」であり、同じ文字が連続しています。つまり、文字列内を先頭から順に走査し、隣接する2文字が一致している
-
Pythonで文字列がaⁿbⁿパターンに一致するかどうかを判定する方法
文字列 s が与えられたとき、その文字列が aⁿbⁿ パターンに従っているかどうかを判定する方法を解説します。このパターンとは、「a」がn個続き、その後に「b」がn個続く形式の文字列のことです。たとえば n = 3 の場合、文字列は aaabbb となります。 たとえば、入力が s = aaaaabbbbb の場合、この文字列は a⁵b⁵ の形に一致するため、出力は True になります。 解決のアプローチ この問題は、以下の手順で解くことができます。 まず、文字列 s の長さを取得します。 先頭から順に文字を走査し、「a」以外の文字が出現した位置でループを抜けます。これにより、「a」が連続
-
Pythonで文字列の全文字が同じ頻度かどうかを確認する方法(1文字の削除を許可)
小文字のみで構成された文字列 s が与えられます。ここで、最大1文字だけ削除することで、すべての異なる文字の出現回数が等しくなる「有効な文字列」に変換できるかどうかを判定しましょう。 問題の例 入力が s = xyyzx の場合を考えてみます。文字 z を1つ削除すると xyyx になり、x と y の出現回数がどちらも2回で一致します。したがって、この場合の出力は True になります。 解法の考え方 まず各文字の出現回数を数え、その頻度が高々2種類にまとめられるかを確認します。3種類以上の異なる頻度が存在する場合は、1文字の削除では絶対に揃えられないため False を返します。具体的な手
-
Pythonで文字列にm個の連続した1または0が含まれているかを判定する方法
2進数のみで構成された文字列 s と整数値 m が与えられたとき、その文字列の中に m個連続した「1」 または m個連続した「0」 が含まれているかどうかを判定する問題を考えてみましょう。たとえば、入力が s = 1110111000111、m = 3 の場合、「000」という3つ連続した0や「111」という3つ連続した1が存在するため、出力は True になります。解決のアプローチこの問題は、文字列を先頭から順に走査しながら、連続する「0」と「1」の出現回数をそれぞれカウントすることで解決できます。具体的には以下の手順に従います。str_size := 文字列 s の長さcount_0 :=
-
Pythonで文字列がコリンドローム(Colindrome)かどうかを判定する方法
コリンドロームとは?「コリンドローム(Colindrome)」とは、長さ6の回文(パリンドローム)を連結してできた文字列のことを指します。回文とは、前から読んでも後ろから読んでも同じになる文字列のことです。例えば、入力が s = aabbaamnoonm の場合を見てみましょう。この文字列は「aabbaa」と「mnoonm」という2つの長さ6の回文に分割できるため、出力は True になります。解法のアプローチこの問題を解くには、以下の手順に従います。まず、文字列 s の長さが6の倍数でない場合は False を返します。次に、0から文字列の末尾まで6文字ずつ区切りながらループ処理を行います。
-
Pythonで文字列がアイソグラム(Isogram)かどうかを判定する方法
ある文字列 s が与えられたとき、その文字列がアイソグラム(isogram)であるかどうかを判定する方法を解説します。アイソグラムとは、すべての文字がそれぞれちょうど1回だけ出現する文字列のことです。例えば、入力が s = education の場合、出力は True になります。これは「education」に含まれるすべての文字(e、d、u、c、a、t、i、o、n)がそれぞれ1回しか現れないためです。解決のアプローチこの問題は、以下の手順で解決できます。空のリスト char_list を用意する文字列内の各文字について次の処理を行うその文字がアルファベットの場合:すでに char_list
-
Pythonで文字列が別の文字列の接尾辞(サフィックス)かどうかを判定する方法
問題の概要2つの文字列 s と t が与えられたとき、s が t の接尾辞(サフィックス)であるかどうかを判定します。例えば、s = ate、t = unfortunate の場合、unfortunate という文字列は ate で終わっているため、出力は True になります。解決手順この問題は、以下の手順で解くことができます。s_len に s の長さ、t_len に t の長さを格納するs_len が t_len より大きい場合、s の方が長いため接尾辞になり得ず、False を返すi を 0 から s_len - 1 までループし、両方の文字列を末尾から順に1文字ずつ比較する1文字でも
-
Pythonで文字列tが文字列sの長押しタイピング結果かどうかを判定する方法
2つの小文字のみで構成された文字列 s と t があるとします。タイピング中に母音のキーをうっかり長押しすると、その母音が1回以上繰り返し入力されることがあります。ここでは、t が「s を長押し込みで入力した結果」となり得るかどうかを判定する方法を解説します。たとえば、s = mine、t = miiine という入力の場合、母音 i が3回繰り返されていますが、それ以外の文字は変化していないため、出力は True になります。解決のための手順この問題は、両方の文字列を先頭から同時に走査し、対応する文字ごとの連続出現回数を比較することで解決できます。具体的な手順は以下の通りです。s_len ←
-
Pythonで指定された3つの角度から正の面積を持つ三角形が作成できるか判定する方法
プログラミングの練習問題としてよく登場するのが、「与えられた3つの角度を使って、正の面積を持つ三角形を作成できるかどうかを判定する」という課題です。本記事では、Pythonを使ってこの問題を解く方法を、条件と実装例を交えながらわかりやすく解説します。 三角形が成立するための条件 3つの角度から三角形が成立するためには、以下の条件を満たす必要があります。 3つの角度がすべて0より大きい(0ではない) 3つの角度の合計がちょうど180度である 任意の2つの角度の和が、残りの1つの角度以上である 例えば、入力が a = 40、b = 120、c = 20 の場合、40 + 120 + 20 =
-
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 として初期化
-
Pythonでリスト内の全要素がユニーク(重複なし)かどうかを判定する方法
Pythonでは、数値のリスト nums が与えられたとき、そのすべての要素が一意(重複していない)かどうかを簡単に確認できます。 例えば、nums = [2, 3, 6, 5, 1, 8] の場合、すべての要素が異なるため、結果は True になります。 解決の手順 リスト l のサイズを n として取得します 空のセット(集合)s を作成します i を 0 から n-1 までループさせながら、s に l[i] を追加していきます 最後に、s のサイズが l のサイズと一致すれば True、一致しなければ False を返します 実装例 def solve(l): n = l
-
Pythonで数値の全ビットがセット(1)されているかどうかを確認する方法
問題の概要ある整数 n が与えられたとき、その数値のすべてのビットが 1(セット済み)になっているかどうかを判定します。例えば、n = 255 の場合、255 の2進表現は「11111111」となり、すべてのビットが 1 なので、結果は True になります。一方、n = 10(2進数で「1010」)のように 0 のビットが含まれる場合は False となります。解決のアプローチこの問題は、次の手順で解くことができます。数値が 0 と等しい場合は False を返す数値が 0 より大きい間、以下を繰り返す最下位ビットが 0(つまり偶数)であれば False を返す数値を右に1ビットシフトする(
-
Pythonで数値のすべての桁がその数を割り切れるかどうかを判定する方法
ある数値 n が与えられたとき、その数を構成するすべての桁が n を割り切れるかどうかを判定する問題を考えてみましょう。例えば、入力が n = 135 の場合、出力は True になります。これは以下のように、すべての桁で割り切れるためです。135 ÷ 1 = 135135 ÷ 3 = 45135 ÷ 5 = 27解決のためのアプローチこの問題は、次の手順で解くことができます。変数 val に n の値を代入します。val が 0 より大きい間、以下を繰り返します。d に val を 10 で割った余り(つまり一番下の桁)を代入します。n が d で割り切れない場合は False を返します。