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

3番目の文字列との交換で2つの文字列を一致させられるかを判定するC++プログラム

同じ長さ n の3つの文字列 S・T・U が与えられているとします。0 から n-1 までの各インデックス i に対して、U[i] を S[i] または T[i] のどちらか一方と交換する必要があります。つまり、合計でちょうど n 回の交換操作を行うことになります。この一連の操作を終えたとき、文字列 S を T と完全に一致させられるかどうかを判定するのが本問題です。

考え方

実は、この問題は各インデックスごとに独立して考えることができます。インデックス i の交換は S[i] と T[i] のどちらか一方にしか影響しないためです。

  • U[i] を S[i] と交換した場合:S[i] は元の U[i] の文字になり、T[i] は変化しません。よって S[i] == T[i] となるのは U[i] == T[i] のときです。
  • U[i] を T[i] と交換した場合:T[i] は元の U[i] の文字になり、S[i] は変化しません。よって S[i] == T[i] となるのは S[i] == U[i] のときです。

したがって、すべての i について「S[i] が U[i] と等しい」または「T[i] が U[i] と等しい」の少なくとも一方が成り立てば答えは Yes、どちらにも一致しない位置が1つでも存在すれば答えは No となります。

解くための手順

以下の手順に従って判定します。

for initialize i := 0, when S[i] is non-zero, update (increase i by 1), do:
    if S[i] is not equal to U[i] and T[i] is not equal to U[i], then:
        return false
    return true

C++による実装例

理解を深めるために、実際の実装を見てみましょう。

#include <bits/stdc++.h>
using namespace std;

bool solve(string S, string T, string U) {
    for (int i = 0; S[i]; ++i)
        if (S[i] != U[i] && T[i] != U[i])
            return false;
    return true;
}
int main() {
    string S = "abc";
    string T = "bca";
    string U = "bca";
    cout << solve(S, T, U) << endl;
}

入力

"abc", "bca", "bca"

出力

1

出力が 1(true)となり、条件を満たすことが確認できました。この例では、すべての i について U[i] を S[i] と交換すれば S は "bca" になり、T は最初から "bca" であるため一致します。計算量は文字列の長さを n とすると O(n) で、非常に効率的なアルゴリズムです。

  1. 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を足した場合は、その桁

  2. Pythonで文字列のすべての文字を使ってk個の回文を作成できるかどうかを判定する方法

    問題概要 文字列 s と整数 k が与えられたとき、s に含まれるすべての文字を使って、ちょうど k 個の回文(前から読んでも後ろから読んでも同じになる文字列)を作成できるかどうかを判定します。 たとえば、入力が s = amledavmel、k = 2 の場合、「level」と「madam」という2つの回文を作成できるため、出力は True になります。 解法の考え方 回文の性質に注目すると、この問題は非常にシンプルに解けます。回文では、奇数回出現できる文字は最大で1種類だけです。したがって、文字列のすべての文字を k 個の回文に振り分けられる条件は、「奇数回出現する文字の種類数が k 以