C++
 Computer >> コンピューター >  >> プログラミング >> C++

文字'a'を1文字挿入して文字列を回文でなくすC++プログラム

小文字の英字のみで構成された文字列 S が与えられます。ここで、S にちょうど 1 つだけ文字「a」を挿入することを考えます。挿入後の文字列が回文(前から読んでも後ろから読んでも同じ並びになる文字列)ではなくなるようにできた場合は、その結果の文字列を返します。どこに挿入しても回文になってしまう場合は「Impossible」を返します。

例えば、入力が S = "bpapb" の場合、末尾に「a」を追加した "bpapba" は回文ではないため、これが出力となります。

解法の考え方

この問題は、非常にシンプルなアプローチで解くことができます。「a」を末尾に追加した文字列と先頭に追加した文字列のそれぞれについて回文判定を行い、回文にならない方を採用するだけです。

アルゴリズムの手順

S + "a"(末尾に a を追加)が回文でない場合:
    return S + "a"
"a" + S(先頭に a を追加)が回文でない場合:
    return "a" + S
いずれにも該当しない場合:
    return "Impossible"

補足として、両方のパターンが回文になってしまうのは、S がすべて「a」で構成されている場合のみです。このときは「a」をどの位置に挿入しても結果が回文のまま変わらないため、答えは存在しないことになります。

C++による実装例

#include <bits/stdc++.h>
using namespace std;

// 回文かどうかを判定する補助関数
bool p(const string& s) {
    for (int i = 0; i < s.size() / 2; i++)
        if (s[i] != s[s.size() - 1 - i])
            return false;
    return true;
}

string solve(string S) {
    // 末尾に 'a' を追加して試す
    if (!p(S + 'a'))
        return S + 'a';
    // 先頭に 'a' を追加して試す
    else if (!p('a' + S))
        return 'a' + S;
    // どうしても回文になってしまう場合
    else
        return "Impossible";
}

int main() {
    string S = "bpapb";
    cout << solve(S) << endl;
}

コードのポイント

関数 p() は、受け取った文字列が回文かどうかを判定する補助関数です。文字列の先頭と末尾から中央に向かって文字を比較していき、一致しないペアが見つかった時点で false を返します。計算量は文字列長に対して線形時間 O(N) と効率的です。

関数 solve() では、まず S + 'a'(末尾に追加したパターン)の回文判定を行い、回文でなければその文字列を返します。次に 'a' + S(先頭に追加したパターン)を判定し、こちらも回文でなければ返します。両方とも回文になってしまった場合のみ "Impossible" を返します。

実行結果

入力

"bpapb"

出力

bpapba

入力 "bpapb" に対しては、末尾に「a」を追加した "bpapba" が出力されます。この文字列は前から読んでも後ろから読んでも並びが異なる、つまり回文ではないため、条件を正しく満たしています。

  1. C++で文字列の長さを求める方法:基本テクニックとstrlen()関数の使い方

    C++における文字列とは、ヌル文字(\0)で終端される1次元の文字配列のことです。文字列の長さとは、このヌル文字より前に存在する文字数を指します。例えば、次のような文字列を考えてみましょう。char str[] = The sky is blue; 上記の文字列に含まれる文字数 = 15それでは、文字列の長さを求めるプログラムを見ていきましょう。例1:whileループを使って文字数をカウントする方法#include<iostream> using namespace std; int main() {    char str[] = Apple; &n

  2. C++で文字のASCII値を取得・表示する方法を解説

    ASCII(American Standard Code for Information Interchange:米国標準情報交換コード)には、0から127までの番号が振られた128種類の文字が定義されています。アルファベット、数字、記号など、さまざまな文字に固有の数値が対応付けられているのが特徴です。 主な文字とそのASCII値の例は以下のとおりです。 文字ASCII値 A65 a97 Z90 z122 $36 &38 ?63 大文字と小文字では異なる値が割り当てられている点にも注目してください。たとえば「A」は65、「a」は97となっており、両者の差は32です。この規