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

C++で特定の文字列が回文の回転であるかどうかを判定する方法

回文の回転とは

回文(パリンドローム)とは、前から読んでも後ろから読んでも同じになる文字列のことです。本記事では、ある文字列が「回文を回転させたもの」になっているかどうかをC++で判定する方法を解説します。

例えば「AAAAD」という文字列は、そのままでは回文ではありません。しかし、これを1文字ずつ回転させていくと「AADAA」となり、これは回文です。このように、元の文字列自体は回文でなくても、適切な位置まで回転させることで回文になるケースが存在します。

判定アルゴリズムの考え方

文字列が回文の回転であるかを確認するには、以下の手順を実行します。

  1. まず、現在の文字列が回文かどうかをチェックします。
  2. 回文でなければ、文字列を1文字分左に回転させます。
  3. 再度回文かどうかをチェックします。
  4. この処理を文字数n回繰り返し、1度でも回文になれば「回文の回転」と判定できます。

すべての回転パターンを試しても回文が見つからない場合は、その文字列のどの回転も回文ではないと結論付けられます。計算量は各回転ごとに回文判定にO(n)かかるため、全体でO(n²)となります。

C++による実装例

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

// 指定範囲[left, right]が回文かどうかを再帰的に判定する関数
bool isPalindromeRange(string str, int left, int right){
    return (left >= right) || (str[left] == str[right] && isPalindromeRange(str, left + 1, right - 1));
}

// 回転を繰り返しながら回文判定を行う関数
bool isRotatedPalindrome(string str){
    int len = str.length();
    for (int i = 0; i < len; i++){
        // 1文字分だけ左へ回転
        rotate(str.begin(), str.begin() + 1, str.end());
        if (isPalindromeRange(str, 0, len - 1)) // 回転後の文字列が回文ならtrueを返す
            return true;
    }
    return false;
}

int main(){
    string str = "AAAAD"; // 「AADAA」が回文になる
    if (isRotatedPalindrome(str))
        cout << "Its rotation is palindrome";
    else
        cout << "Its rotation is not palindrome";
}

実行結果

Its rotation is palindrome

このプログラムでは、STLのrotate関数を使って文字列を1文字ずつ回転させながら、再帰的な回文判定関数isPalindromeRangeで全パターンをチェックしています。「AAAAD」の場合、2回目の回転で「AADAA」となり回文が見つかるため、「Its rotation is palindrome(その回転は回文である)」と出力されます。

  1. 指定された文字列が母音回文であるかどうかを確認するPythonプログラム

    はじめに この記事では、「与えられた文字列から子音をすべて取り除いたとき、残った母音だけの文字列が回文になっているかどうかを判定する」という問題を、Pythonプログラムで解く方法を解説します。 問題の概要 問題文:母音と子音の両方を含む文字列が与えられます。まず文字列からすべての子音を取り除き、その結果得られた文字列が回文(前から読んでも後ろから読んでも同じ並びになる文字列)であるかどうかを確認してください。 解決のアプローチ この問題は、以下の手順で解くことができます。 元の文字列を先頭から順に走査し、母音(a・e・i・o・u)だけを取り出して新しい文字列を作成します。 母音が1つも

  2. Pythonで文字列・数値が回文(パリンドローム)かどうかを判定する方法【スライス活用】

    本記事では、入力された文字列や数値が回文(パリンドローム)であるかどうかを判定するPythonプログラムの解決策とアプローチについて解説します。 問題の概要 文字列が入力として与えられたとき、それが回文であるかどうかを判定するPython関数を作成する必要があります。 回文とは、文字列を逆から読んでも元の文字列と完全に一致するものを指します。たとえば「78287」や「しんぶんし」などが代表的な例です。 解決のアプローチ 回文判定は、主に以下の2つの方法で実現できます。 スライスによる文字列の反転 負のインデックスを使った比較 本記事では、このうちスライスを使った文字列の反転方法を中心に