C++で文章中の回文単語を数える方法を解説
英文の文章を表す文字列が与えられます。この記事では、その文章に含まれる回文(パリンドローム)の単語の数を求める方法を解説します。回文とは、先頭から読んでも末尾から読んでも同じ文字並びになる単語のことです。例えば、文章が「Madam speaks good Malayalam」であれば、回文の単語は2つ(Madam と Malayalam)になります。
注意 − 単語には大文字と小文字が混在している場合があります。
それでは、具体的な例で確認していきましょう。
入力 − str = "My Mom and Anna left at Noon";
出力 − 文中の回文単語の数 − 3
説明 − この文章における回文単語は Mom、Anna、Noon の3つです(大文字・小文字は区別しません)。
入力 − str = "I am at level 121 in Racecar game";
出力 − 文中の回文単語の数 − 4
説明 − この文章における回文単語は I、level、121、Racecar の4つです(大文字・小文字は区別しません)。
プログラムで使用するアプローチ
文章内の各単語をスペース「 」で区切って取り出し、判定用の関数に渡します。関数はまず単語の文字をすべて小文字に変換します。その後、単語の先頭から順に走査し、word[0] と word[length-1]、word[1] と word[length-2] のように対応する文字同士を比較していきます。不一致が見つかった時点でループを抜けて false を返し、最後まで一致すれば true を返します。
- 文章を含む文字列 str[] を用意します。
- 関数 check(string extra) は文字列を受け取り、回文であれば true、そうでなければ false を返します。
- 文字列 extra の長さを len = extra.length() として求めます。
- transform(extra.begin(), extra.end(), extra.begin(), ::tolower) を使って文字列全体を小文字に変換します。
- for ループで単語のインデックス 0 から len 未満まで走査します。
- extra[i] と extra[len-1] を比較します。不一致があれば false を返し、最後まで一致すれば true を返します。
- 関数 palindrome(string str, int length) は文章とその長さを受け取り、文中の回文単語の数を返します。
- カウント count の初期値を 0 にします。
- 個々の単語を取り出して格納するための一時文字列 extra = "" を用意します。
- for ループでインデックス 0 から length 未満まで文章を走査します。
- 一時変数 temp = str.at(i) で現在の文字を取得します。
- temp がスペースでなければ、extra に追加して単語を組み立てます。
- temp がスペースであれば、check(extra) が true を返した場合に count をインクリメントします。
- extra を再び "" にリセットします。
- 最終的な count が回文単語の総数となります。
- count を結果として返します。
コード例
#include <bits/stdc++.h>
using namespace std;
bool check(string extra){
int len = extra.length();
transform(extra.begin(), extra.end(), extra.begin(), ::tolower);
for (int i = 0; i < len; i++,len--){
if (extra.at(i) != extra.at(len - 1)){
return false;
}
}
return true;
}
int palindrome(string str, int length){
int count = 0;
string extra = "";
for (int i = 0; i < length; i++){
char temp = str.at(i);
if (temp != ' '){
extra = extra + temp;
}
else{
if (check(extra))
{ count++; }
extra = "";
}
}
return count;
}
int main(){
string str = "nitin wants nitin for his company named nitin after nitin";
str = str + " ";
int length = str.length();
cout<<"Count of palindrome words in a sentence are: "<<palindrome(str, length)<<endl;
return 0;
}
出力
上記のコードを実行すると、次のような出力が得られます −
Count of palindrome words in a sentence are: 4
コードのポイント
このプログラムでは、文章の末尾にスペースを1つ追加することで、最後の単語も確実に回文判定できるようにしています。また、回文判定では先頭と末尾から2つのインデックスを同時に動かして中央で出会うまで比較するため、効率的に判定できます。数字を含む単語(例:121)も同じロジックで回文として判定可能です。
-
Pythonで文字列内の単語数をカウントする3つの方法
はじめに Pythonでは、テキスト処理の一環として「文章中に単語がいくつ含まれているか」を数える場面がよくあります。本記事では、与えられた文字列から単語数をカウントするための代表的な3つのアプローチを、具体的なコード例と実行結果とともにわかりやすく解説します。 問題の定義 問題文: 与えられた文字列の中に含まれる単語の数を数える。例えば、「Tutorials point is a learning platform」という文字列には、6個の単語が含まれています。 方法1:split()関数を使う split()関数は、文字列をスペースを区切り文字として分割し、リストを返します。引数を指定
-
Pythonで文中の単語数をカウントする方法|split()とisalpha()を使った2つのアプローチ
本記事では、Pythonを使って文章中の単語数を数えるための解法と、その具体的なアプローチについて詳しく解説します。 問題定義 ある文が与えられたとき、その文に含まれる単語の総数をカウントするプログラムを作成します。 ここでは、以下の2つのアプローチを取り上げます。 アプローチ1: split()関数を使用する方法 アプローチ2: strip()関数とisalpha()関数を組み合わせる方法 アプローチ1:split()関数を使う方法 最もシンプルな方法は、文字列に対してsplit()関数を適用するやり方です。split()はデフォルトで空白文字(スペースやタブなど)を区切りとして文字列を