【C++】1文字削除後に2つの文字列のいずれかと一致する文字列の数を求める方法
この記事では、2つの異なる文字列 s1 と s2 が与えられたときに、それらの一意な文字を組み合わせて文字列 S を作成し、S から1文字を削除した結果が s1 または s2 のいずれかと一致するパターンの数を求める方法を解説します。
例
例1
入力: S1 = "utter"、S2 = "butter"
出力: 1回の削除後に2つの文字列のいずれかと一致する文字列の数: 1
説明: 文字列 S として「butter」を作成します。S から文字「b」を削除すると「utter」になり、これは s1 と一致します。したがって、カウントは1です。
例2
入力: S1 = "fat"、S2 = "rat"
出力: 1回の削除後に2つの文字列のいずれかと一致する文字列の数: 2
説明: 文字列 S として「frat」を作成します。「r」を削除すると「fat」になり s1 と一致し、「f」を削除すると「rat」になり s2 と一致します。したがって、カウントは2です。
プログラムで使用しているアプローチ
- 2つの文字列 s1 と s2 を宣言し、文字列 s1 のサイズを計算して、以降の処理のために関数へ渡します。
- 変数 count を宣言し、答えとして考えられる最大値が2であるため、初期値を2に設定します。
- ループ走査用に、start と end という2つの一時変数を宣言します。
- 0から文字列 s1 のサイズまで FOR ループを実行し、ループ内で s1[i] が s2[i] と等しくない場合、start に i を代入して break します(最初の差分位置を検出)。
- 別の FOR ループを文字列 s1 のサイズ - 1 から 0 まで逆方向に実行し、ループ内で s1[i] が s2[i] と等しくない場合、end に i を代入して break します(最後の差分位置を検出)。
- end の値が start より小さい場合(両文字列が完全に一致している場合)、count を 26 × (文字列 s1 のサイズ + 1) に設定して返します。
- ELSE IF で start が end と等しい場合(差分が1文字だけの場合)、count をそのまま返します。
- それ以外の場合、i を start + 1 から end まで FOR ループで走査し、s1[i] が s2[i-1] と等しくなければ count を1減らして break します。
- 同様に、i を start + 1 から end まで FOR ループで走査し、s1[i-1] が s2[i] と等しくなければ count を1減らして break します。
- 最終的な count を返します。
- main 関数で結果を出力します。
コード例
#include <bits/stdc++.h>
using namespace std;
int equal_removal(string S1, string S2, int size_S1) {
int count = 2;
int start;
int end;
for (int i = 0; i < size_S1; ++i) {
if (S1[i] != S2[i]) {
start = i;
break;
}
}
for (int i = size_S1 - 1; i >= 0; i--) {
if (S1[i] != S2[i]) {
end = i;
break;
}
}
if (end < start) {
count = 26 * (size_S1 + 1);
return count;
} else if (start == end) {
return count;
} else {
for (int i = start + 1; i <= end; i++) {
if (S1[i] != S2[i - 1]) {
count--;
break;
}
}
for (int i = start + 1; i <= end; i++) {
if (S1[i - 1] != S2[i]) {
count--;
break;
}
}
return count;
}
}
int main() {
string S1 = "utter";
string S2 = "butter";
int size_S1 = S1.length();
cout << "Count of strings that become equal to one of the two strings after one removal are: " << equal_removal(S1, S2, size_S1);
return 0;
}上記のコードを実行すると、次の出力が生成されます。
出力
Count of strings that become equal to one of the two strings after one removal are: 1
-
C++で円をN回カットしたときのピース数を計算する方法
問題の概要整数Nが与えられます。このNは、2次元平面上の円に対して加える「カット(切り込み)」の回数を表します。1回のカットによって円は2つに分けられるため、N回のカットを行った後に円がいくつのピースに分割されるかを求めるのが、この問題の目的です。計算式この問題はとてもシンプルで、次の式で答えを求めることができます。ピースの数 = 2 × カットの回数(N)各カットが円の中心を通って切断されると考えると、カット1回ごとにピースが2つずつ増えていくため、この式が成り立ちます。具体例入力: N = 1出力: 円のピース数: 2説明: 1回のカットで、円はちょうど2つの半分に分けられます。入力: N
-
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を足した場合は、その桁