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

C++で文字配列に格納された文の単語順を反転する方法

各要素が1文字として格納された文字配列(文)が入力として与えられたとき、その文を単語ごとに反転することを考えます。

例えば、入力が ["t","h","e"," ","m","a","n"," ","i","s"," ","n","i","c","e"] の場合、出力は ["n","i","c","e"," ","i","s"," ","m","a","n"," ","t","h","e"] となります。つまり、各単語内の文字の並びはそのままに、単語の出現順だけが逆になります。

この問題を解くために、以下の手順に従います。

  • 配列 s 全体を反転する
  • j := 0 とする
  • n := s のサイズとする
  • i := 0 から i < n まで、i を1ずつ増やしながら以下を繰り返す
    • s[i] が空白文字 ' ' と等しい場合、以下を行う
      • 配列 s のインデックス j から i までの範囲を反転する
      • j := i + 1 とする
  • 最後に、配列 s のインデックス j から n までの範囲を反転する

このアルゴリズムのポイントは、2段階の反転を行う点にあります。まず文字列全体を反転することで単語の並び順を逆にし、その後に空白文字を区切りとして各単語内の文字順を元に戻します。この方法なら、余分な配列を用意することなく in-place(その場)で処理を完了できます。

それでは、理解を深めるために以下の実装例を見てみましょう。

実装例

#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<auto> v){
   cout << "[";
   for(int i = 0; i<v.size(); i++){
      cout << v[i] << ", ";
   }
   cout << "]"<<endl;
}
class Solution {
   public:
   void reverseWords(vector<char>& s) {
      reverse(s.begin(), s.end());
      int j = 0;
      int n = s.size();
      for(int i = 0; i < n; i++){
         if(s[i] == ' '){
            reverse(s.begin() + j, s.begin() + i);
            j = i + 1;
         }
      }
      reverse(s.begin() + j, s.begin() + n);
   }
};
main(){
   Solution ob;
   vector<char> v = {'t','h','e',' ','m','a','n',' ','i','s',' ','n','i','c','e'};
   ob.reverseWords(v);
   print_vector(v);
}

入力

{'t','h','e',' ','m','a','n',' ','i','s',' ','n','i','c','e'}

出力

[n, i, c, e,  , i, s,  , m, a, n,  , t, h, e]

計算量の評価

このアルゴリズムの時間計算量は O(n) です。配列全体の反転に O(n)、その後の各単語の反転も合計で O(n) に収まるためです。また、空間計算量は O(1) であり、入力配列を直接書き換えるため、追加のメモリはほとんど必要ありません。大きな文字列を扱う場合でも効率的に動作する、実用的なアプローチと言えます。

  1. C言語で配列を逆順に反転させるプログラムの書き方

    配列とは、共通の名前のもとで管理される、関連性のあるデータ項目の集まりのことです。同じ型の複数の値を効率的に扱いたい場合に活用されます。配列の宣言構文C言語で配列を宣言する際の基本的な構文は以下のとおりです。データ型 配列名 [サイズ];配列の初期化配列は、宣言と同時に初期化することもできます。int a[5] = { 10,20,30,40,50};この例では、整数型の配列 a の5つの要素に、それぞれ10から50までの値が順番に格納されています。C言語で配列を逆順にする方法配列の要素を逆順に並べ替えるには、要素の入れ替え(スワップ)やコピーのテクニックを利用します。たとえば、4つの要素を持

  2. C++で配列がビトニック配列かどうかを判定するプログラム

    N個の整数からなる配列 arr[N] が与えられたとき、その配列がビトニック配列であるかどうかを判定するのが本記事のテーマです。ビトニック配列であれば「Yes its a bitonic array」と出力し、そうでなければ「No its not a bitonic array」と出力します。ビトニック配列とは、まず厳密に増加し、その後厳密に減少するような配列のことです。たとえば arr[] = {1, 2, 3, 4, 2, -1, -5} という配列は、4までは厳密に増加しており、4以降は厳密に減少しているため、ビトニック配列といえます。入力例と出力例入力arr[] = {1, 3, 5,