【C++】文字列内で最も長く連続して繰り返される文字を見つける方法
アルファベットからなる文字列が与えられます。この課題では、文字列の中で最も長く連続して繰り返されている文字を見つけます。具体的な例を通じて確認していきましょう。
入力例と出力例
入力: String[] = "abbbabbbbcdd"
出力: b
説明: この文字列において、最も長い連続シーケンスを持つのは文字「b」で、連続する「b」は4個です。
入力: String[] = "aabbcdeeeeed"
出力: e
説明: この文字列において、最も長い連続シーケンスを持つのは文字「e」で、連続する「e」は5個です。
プログラムで使用しているアプローチ
アルファベットの文字列は、文字配列 string1[] に格納します。
関数 maxRepeating(char str[], int n) は、文字列本体とそのサイズの2つの引数を受け取り、最も長く連続して繰り返される文字を返します。
str[] を先頭の位置から末尾まで順番に走査します。
str[i] と次の文字 str[i+1] が同一である場合、現在の連続カウント(maxC)をインクリメントします。
連続カウントがこれまでの最大値を上回った場合、その値を count に、該当する文字を repchar に保存します。
最終的な結果として repchar を返します。
C++実装例
#include <iostream>
#include <cstdio>
char maxRepeating(char str[], int n){
int count = 0;
char repchar = str[0];
int maxC = 1;
for (int i = 0; i < n; i++){
if (str[i] == str[i+1] && i < n-1)
maxC++;
else{
if (maxC > count){
count = maxC;
repchar = str[i];
}
maxC = 1;
}
}
return repchar;
}
int main(){
char string1[] = "aaabbaacccddef";
int N = 14;
printf("最大連続繰り返し文字: %c\n", maxRepeating(string1, N));
return 0;
}実行結果
上記のコードを実行すると、次の出力が生成されます。
最大連続繰り返し文字: a
処理のポイントと計算量
このアルゴリズムは、文字列を先頭から一度だけ走査すればよいため、時間計算量は O(n)、追加で必要な記憶域は O(1) という非常に効率的な設計になっています。隣接する文字が異なる箇所(連続区間の切り替わり)で、直前に続いた区間の長さを最大値と比較することで、最も長く繰り返された文字を漏れなく特定できます。ログデータの解析や圧縮処理(RLEなど)の基礎となる典型的な文字列走査のパターンなので、ぜひマスターしておきましょう。
-
C++で文字列内の文字の出現頻度を求めるプログラム
文字列と文字の頻度とは文字列とは、NULL文字(\0)で終端される1次元の文字配列のことです。文字列における「文字の頻度」とは、特定の文字がその文字列の中に何回出現するかを表す数値です。例えば、以下のようになります。文字列: Football is a sport上記の文字列に含まれるアルファベット「o」の頻度は3特定の文字の頻度を求めるプログラム特定のアルファベットの出現回数を求めるプログラムは、以下のとおりです。例#include <iostream>using namespace std;int main() { char str[100]
-
C++の文字リテラルと文字列リテラルの違いをわかりやすく解説
C++における文字リテラルと文字列リテラルの基本C++では、シングルクォート( )で囲まれた1文字は「文字リテラル」として扱われ、その型は char になります。例えば a は char 型であり、ASCIIベースのシステムでは整数値 97 を持ちます。一方、ダブルクォート( )で囲まれた1文字または複数文字の並びは「文字列リテラル」として扱われます。その型は const char[] であり、実体は「文字列の長さ + 1」のサイズを持つ配列です。この余分な1文字分は、文字列の終端を示すヌル文字(\0)として確保されています。具体的な違いのポイント文字リテラル: 原則として1文字のみを格納する