C++で2つの文字列に共通する文字ペアを数える方法
本記事では、2つの文字列(str1とstr2)が与えられたときに、両者に共通する文字のペア数を求める方法を解説します。具体的には、str1[i] == str2[j]となる組み合わせを「一致するペア」とみなし、該当するたびにカウントを1ずつ増やしていきます。逆にstr1[i] != str2[j]の場合はペアとして扱われず、カウントも増加しません。
実行例
入力 − str1 = "hello"
str2 = "heoo"
出力 − count is: 3
説明: str1[0] = str2[0](h)、str1[1] = str2[1](e)は一致しており、str1[2] != str2[2](l と o)は不一致です。さらにstr1[3] = str2[3](o)は一致しています。このように、同じ文字で構成されるペアは3組、異なる文字からなるペアは1組となります。
入力 − str1 = "point"
str2 = "print"
出力 − count is: 4
説明: str1[0] = str2[0](p)、str1[2] = str2[2](i)、str1[3] = str2[3](n)、str1[4] = str2[4](t)は一致しています。不一致なのはstr1[1] != str2[1](o と r)のみです。したがって、一致するペアは4組、不一致のペアは1組となります。
プログラムで採用しているアプローチ
- 2つの文字列str1とstr2を入力として受け取ります。
- length()関数を使って両方の文字列の長さ(スペースを含む文字数)を整数値として取得します。
- まず、両方の文字列における各文字の出現頻度を0で初期化します。
- str1の頻度を更新するには「f1[str1[i] - 'a']++」を適用し、反復処理のたびに該当文字の頻度を1ずつ増やします。str2についても同じ処理を行います。
- ペア数を算出する際は、f1とf2の対応する各要素に対してmin()関数を適用します。
- 最後に結果を出力します。
サンプルコード
#include <iostream>
using namespace std;
// 有効なインデックスペアを数える関数
int pairs(string str1, int size1, string str2, int size2){
// 文字列str1とstr2の文字出現頻度を格納する配列 f1 と f2
int f1[26] = { 0 };
int f2[26] = { 0 };
// 変数cは有効なペアの数を数えるために使用
int i, c = 0;
// str1とstr2の出現頻度を更新
for (i = 0; i < size1; i++){
f1[str1[i] - 'a']++;
}
for (i = 0; i < size2; i++){
f2[str2[i] - 'a']++;
}
// 有効なペアの数を求める
for (i = 0; i < 26; i++){
c += (min(f1[i], f2[i]));
}
return c;
}
// main関数
int main(){
string str1 = "tutorialspoint", str2 = "codingground";
int size1 = str1.length(), size2 = str2.length();
cout<<"Total pairs with str1[i]=str2[j] are: ";
cout << pairs(str1, size1, str2, size2);
return 0;
}
出力結果
上記のコードを実行すると、以下のような出力が得られます。
Total pairs with str1[i]=str2[j] are − 6
計算量について
このアルゴリズムの時間計算量はO(n + m)(n、mはそれぞれの文字列の長さ)であり、空間計算量はO(1)です。26個分のアルファベット頻度配列のみを使用するため、文字列が長くなっても非常に効率よく動作します。二重ループで全ペアを総当たり的に比較する方法(O(n × m))と比べても、大幅に高速である点が大きなメリットです。
-
C++で2つの文字列の共通しない文字を検索・抽出する方法
はじめに本記事では、C++を使用して2つの文字列に共通しない文字(アンコモン・キャラクター)を見つけるプログラムについて解説します。具体的には、2つの文字列が与えられたとき、どちらか一方の文字列にのみ含まれる文字を抽出し、アルファベット順にソートして出力するのが目的です。問題の概要入力として2つの文字列を受け取り、次の条件を満たす文字を出力します。片方の文字列には存在するが、もう片方には存在しない文字出力はアルファベット順(a〜z)にソートされていること例えば、「tutorials」と「point」という2つの文字列が与えられた場合、共通しない文字は「a l n p r s u」となります。ア
-
C++で2つの2進数文字列を加算するプログラムの書き方
2つの2進数を表す文字列が与えられたとき、それらを加算した結果を求め、その結果を2進数の文字列として返すことを考えます。2進数とは、0か1のいずれかで表現される数値のことです。2進数同士を足し合わせる際には、以下のような2進数特有の加算ルールに従う必要があります。0+0 → 0 0+1 → 1 1+0 → 1 1+1 → 0(繰り上がり1)入力例str1 = {11}, str2 = {1}出力例100入力例str1 = {110}, str2 = {1}出力例111問題を解くためのアプローチ両方の文字列を末尾(最下位桁)から走査する対応する桁の2進数同士を加算する1と1を足した場合は、その桁