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

C++でメタ文字列を判定する方法(1箇所の入れ替えで2つの文字列が一致するか確認する)

メタ文字列とは?

この記事では、2つの文字列が「メタ文字列」であるかどうかを判定する方法を解説します。メタ文字列とは、互いに非常によく似た文字列のことで、片方の文字列内で2つの文字を入れ替えるともう片方の文字列と完全に一致するような関係を指します。例えば、「HELLO」と「OELLH」という2つの文字列は、HとOを入れ替えることで一致するため、メタ文字列です。

判定の手順

2つの文字列がメタ文字列かどうかを確認するには、以下の手順に従います。

  • 両方の文字列の長さが異なる場合は、false を返す。
  • 長さが同じ場合は、一致しない文字の数を数え、その位置(インデックス)も記録する。
  • 不一致の文字数が2より大きい場合は、false を返す。
  • それ以外の場合は、該当する文字を入れ替えて再度比較し、2つの文字列が一致すれば true、一致しなければ false を返す。

C++による実装例

#include <iostream>
using namespace std;
bool areTheyMetaString(string s1, string s2) {
    int s1_len = s1.length();
    int s2_len = s2.length();
    if (s1_len != s2_len)
    return false;
    int prev = -1, curr = -1;
    int count = 0;
    for (int i=0; i<s1_len; i++) {
        if (s1[i] != s2[i]) {
            count++; // 一致しない文字の数
            if (count > 2)
            return false;
            prev = curr;
            curr = i;
        }
    }
    return (count == 2 && s1[prev] == s2[curr] && s1[curr] == s2[prev]);
}
int main() {
    string s1 = "HELLO", s2 = "OELLH";
    if(areTheyMetaString(s1, s2)){
        cout << "Meta Strings";
    } else {
        cout << "Not Meta Strings";
    }
}

実行結果

Meta Strings

コードのポイント

このアルゴリズムでは、不一致の文字は最大でも2つまでしか許容されません。また、単に不一致が2箇所あるだけでなく、s1[prev] == s2[curr] かつ s1[curr] == s2[prev] という条件、つまり互いの文字が交差して一致している必要があります。これにより、実際に1回の入れ替えで2つの文字列が等しくなることが保証されます。計算量は文字列の長さを 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で2つの文字列を連結して特定の文字列を生成できるかどうかを判定する方法

    この記事では、2つの文字列 s と t、およびもう1つの文字列 r が与えられたときに、r が s + t または t + s(連結)として表現できるかどうかを判定する方法を解説します。例えば、s = world、t = hello、r = helloworld という入力の場合、helloworld(r)は hello(t)+ world(s)と一致するため、出力は True になります。解決のアプローチこの問題は、以下の手順で解くことができます。長さのチェック: r の長さが s と t の長さの合計と異なる場合、連結では絶対に作れないため False を返します。パターン1の確認: r