C++で母音で始まり子音で終わる文字列のすべての部分列を出力する方法
問題概要
この問題では、与えられた文字列の中から、母音で始まり子音で終わる部分列をすべて見つけ出します。
文字列とは、文字を要素とする配列のことです。
ここで生成する部分列は、元の文字列からいくつかの文字を削除することで作成できます。ただし、文字の並び順は変更してはいけません。
入力:'abc' 出力:ab, ac, abc
解法のアプローチ
この問題を解くには、文字列を先頭から走査し、母音の位置を固定したうえで、その後ろに続く並びを順番に確認していきます。以下に、解法のためのアルゴリズムを示します。
アルゴリズム
ステップ1:変数 i を使い、文字列の各文字を先頭から順に走査します。 ステップ2:i 番目の文字が母音であるかどうかを判定します。 ステップ3:j 番目の文字が子音であるかどうかを判定します。 ステップ4:i 番目の文字から j 番目の文字までの部分列を、HashSet(重複を許さない集合)に追加します。 ステップ5:上記の手順を繰り返し、文字列から条件を満たす部分列をすべて見つけます。
C++での実装例
#include <bits/stdc++.h>
using namespace std;
set<string> st;
bool isaVowel(char c);
bool isaConsonant(char c);
void findSubSequence(string str);
int main(){
string s = "abekns";
findSubSequence(s);
cout<<"The substring generated are :\n";
for (auto i : st)
cout<<i<<" ";
cout << endl;
return 0;
}
bool isaVowel(char c) {
return (c=='a'||c=='e'||c=='i'||c=='o'||c=='u');
}
bool isaConsonant(char c) {
return !isaVowel(c);
}
void findSubSequence(string str) {
for (int i = 0; i < str.length(); i++) {
if (isaVowel(str[i])) {
for (int j = str.length() - 1; j >= i; j--) {
if (isaConsonant(str[j])) {
string str_sub = str.substr(i, j + 1);
st.insert(str_sub);
for (int k = 1; k < str_sub.length() - 1; k++){
string sb = str_sub;
sb.erase(sb.begin() + k);
findSubSequence(sb);
}
}
}
}
}
}コードの仕組み
このプログラムは、補助関数として isaVowel() と isaConsonant() を用意しています。isaVowel() は渡された文字が母音(a, e, i, o, u)かどうかを判定し、isaConsonant() はその否定を返すことで子音かどうかを判定します。
中心となる findSubSequence() 関数では、まず外側のループで母音となる先頭位置 i を固定します。次に内側のループで文字列の末尾側から子音となる位置 j を探し、i から j までの部分文字列を集合に登録します。さらに、その間の文字を1文字ずつ削除した文字列に対して自分自身を再帰的に呼び出すことで、途中の文字を組み合わせたすべての部分列を網羅的に生成しています。結果は set コンテナに格納されるため、重複する部分列は自動的に除外されます。
出力結果
上記のプログラムを実行すると、以下の部分列が出力されます。
ab abek abekn abekns abeks aben abens abes abk abkn abkns abks abn abns abs aek aekn aekns aeks aen aens aes ak akn akns aks an ans as ek ekn ekns eks en ens es
このように、入力文字列「abekns」から、母音で始まり子音で終わるすべての部分列が辞書順に出力されていることが確認できます。
-
C++で木構造のノード数が奇数・偶数となるレベルをすべて出力する方法
この記事では、木(ツリー)構造が与えられたときに、各レベルに含まれるノードの数を調べ、その数が奇数であるレベルと偶数であるレベルをそれぞれ出力する方法を、C++のサンプルコード付きで解説します。 問題の概要 まず、具体的な例を使って概念を確認しましょう。次のような木構造を考えます。 出力: ノード数が奇数のレベル:1, 3, 4 ノード数が偶数のレベル:2 解説: 第1レベルにはノードが1個(奇数)、第2レベルには2個(偶数)、第3レベルには3個(奇数)、第4レベルには1個(奇数)存在します。そのため、奇数となるのは「1, 3, 4」のレベル、偶数となるのは「2」のレベルです。 解き方
-
Javaで母音で始まる単語を抽出する方法を解説
文字列の中から「母音(a、e、i、o、u)で始まる単語」を抽出したいケースは、Javaのテキスト処理においてよくある課題の一つです。この記事では、Stringクラスの基本的なメソッドを組み合わせて、母音で始まる単語を効率的に取り出す手順を解説します。抽出の基本的な流れsplit()メソッドで文字列を分割する: Stringクラスのsplit()メソッドを使い、対象の文字列をスペース区切りでString型の配列に変換します。forループで各単語を走査する: 取得した配列の要素を一つずつ順番に処理していきます。charAt()メソッドで先頭文字を取得する: 各単語の最初の1文字をcharAt(0)