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

【C++】文字列の回転判定:一方の文字列が他方の回転かどうかをチェックする方法

問題概要

2つの文字列 st が与えられたとき、s を回転(rotate)させることで t を作り出せるかどうか、つまり st の回転になっているかを判定します。

例えば、入力が s = "helloworld"t = "worldhello" の場合を見てみましょう。s を適切な位置で分割して前後を入れ替えると t が得られるため、出力は True(1) になります。

解法のアプローチ

この問題は、以下の手順でシンプルかつ効率的に解くことができます。

  • まず、s0s1 の長さが異なる場合は回転になり得ないため、false を返します。

  • s0 を自分自身と連結した文字列 s = s0 + s0 を作成します。

  • s1s に含まれているかを判定し、含まれていれば true、そうでなければ false を返します。

このテクニックが機能する理由は、s0 + s0 という文字列の中に s0 のすべての回転パターンが部分文字列として含まれるからです。実際、"helloworld" を2回連結すると "helloworldhelloworld" となり、その中に "worldhello" が含まれていることが確認できます。

実装例(C++)

それでは、実際のコードを見て理解を深めましょう。

#include <bits/stdc++.h>
using namespace std;
class Solution {
    public:
    bool solve(string s0, string s1) {
        if(s0.size() != s1.size())
        return false;
        string s = s0 + s0;
        return s.find(s1) != string::npos;
    }
};
int main(){
    Solution ob;
    cout << (ob.solve("helloworld", "worldhello"));
}

入力

"helloworld", "worldhello"

出力

1

コードのポイント

  • string::find() は部分文字列を検索する標準ライブラリ関数で、見つからなかった場合に string::npos を返します。これを利用することで、回転の有無を1行で判定できます。

  • 長さの事前チェックにより、無駄な連結や検索処理を回避でき、処理が高速化されます。

  • この手法の時間計算量は O(n)、空間計算量も連結した文字列の分だけ O(n) となります。

  1. C++で質素数(Frugal Number)を判定する方法【サンプルコード付き】

    この記事では、正の整数 N が与えられたときに、その数が質素数(Frugal Number)であるかどうかを判定するプログラムを C++ で作成する方法を解説します。 質素数とは? 質素数(FRUGAL NUMBER)とは、その数自身の桁数が、素因数分解による表現の桁数よりも厳密に大きい数のことです。 例:625 の場合 625 を素因数分解すると 54 となります。 625 自身の桁数:3 桁 54 の表現の桁数:2 桁 3 は 2 よりも厳密に大きいため、625 は質素数です。 最初のいくつかの質素数:125、128、243、256、343、512、625 など 問題を理解するための具

  2. C++で五胞体数(ペンタトープ数)を求める方法

    五胞体数とは? 五胞体数(ペンタトープ数)は、パスカルの三角形の第5の対角線上に現れる数列として知られています。この数列を定義するには、パスカルの三角形に少なくとも5つの数が必要となるため、数列の最初の数はパスカルの三角形の第4行である 1 4 6 4 1 から始まります。 本チュートリアルでは、n番目の五胞体数を求める方法を解説します。まずは具体的な例を見てみましょう。 入力 : 1出力 : 1入力 : 4出力 : 35 以下の図から出力を確認できます。 この問題は数列に関するものなので、解法ではまず数列のパターンを見つけることから始めます。 解法のアプローチ このプログラムでは、数列の