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

C++で一意な文字のみを含む連結文字列の最大長を求めるアルゴリズム


文字列の配列 arr が与えられたとします。ここで扱う文字列 s とは、arr の部分列(サブシーケンス)の中から「重複する文字を一切含まないもの」を選び、それらを連結して作られる文字列のことです。この問題の目的は、そのような s として実現できる最大の長さを求めることです。

例えば、入力が ["cha", "r", "act", "ers"] の場合、出力は 6 になります。このとき条件を満たす解としては "chaers" や "acters" が挙げられます。

解法のアプローチ

この問題を解くために、以下の手順に従って進めます。

  • まず、2つの文字列 s と t を受け取るメソッド ok() を作成します。このメソッドは以下のように動作します。
  • マップ x を用意します。
  • i を 0 から s のサイズまでループさせます。
    • x[s[i]] を1増やします。
    • x[s[i]] が1より大きくなった場合、文字が重複しているため false を返します。
  • i を 0 から t のサイズまでループさせます。
    • x[t[i]] を1増やします。
    • x[t[i]] が1より大きくなった場合は false を返します。
  • すべてのチェックを通過したら true を返します。これにより、s と t を連結しても文字の重複が発生しないかを判定できます。

続いて、本体となるメソッドは以下のような流れになります。

  • 文字列の配列 v を用意し、答えを格納する変数 ans := 0 で初期化します。さらに、空文字列を v に挿入しておきます。
  • i を 0 から arr のサイズまでループさせます。
    • n := v の現在のサイズ
    • j を 0 から n - 1 までループさせます。
      • ok(v[j], arr[i]) が true を返した場合:
        • t := v[j] + arr[i] として新しい連結文字列を作成
        • t を v に追加
        • ans := max(ans, t のサイズ) で最大長を更新
  • 最終的に ans を返します。

この手法では、既に見つかったすべての有効な連結候補を v に保持し、各文字列が新しく追加できるかどうかを順番に検証することで、組み合わせを網羅的に探索しています。

それでは、理解を深めるために以下の実装例を見てみましょう。

実装例

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   bool ok(string s, string t){
      map <char, int > x;
      for(int i = 0; i < s.size(); i++){
         x[s[i]]++;
         if(x[s[i]] >1)return false;
      }
      for(int i = 0; i < t.size(); i++){
         x[t[i]]++;
         if(x[t[i]]>1)return false;
      }
      return true;
   }
   int maxLength(vector<string>& arr) {
      vector <string> v;
      int ans = 0;
      v.push_back("");
      for(int i = 0; i < arr.size(); i++){
         int n = v.size();
         for(int j = 0; j < n; j++){
            if(ok(v[j],arr[i])){
               string t = v[j]+arr[i];
               v.push_back(t);
               ans = max(ans,(int)t.size());
            }
         }
      }
      return ans;
   }
};
main(){
   vector<string> v = {"cha","r","act","ers"};
   Solution ob;
   cout << (ob.maxLength(v));
}

入力

["cha","r","act","ers"]

出力

6
  1. 【Python】2つの文字列から共通しない文字だけを抽出して連結する方法

    この記事では、2つの文字列が与えられたときに、両方の文字列に共通して現れない文字(ユニークな文字)だけを集めた新しい文字列を作成する方法を解説します。 例えば、「hafeez」と「kareem」という2つの文字列がある場合、そこから生成される新しい文字列は「hfzkrm」になります。つまり、片方の文字列にしか存在しない文字だけを取り出すことが目的です。手順を追う前に、まずは自分でロジックを一度考えてみてください。 ロジックが思いつかない場合は、以下の手順に従って進めてみましょう。 アルゴリズム 1. 文字列を初期化する。 2. 空の文字列を初期化する。 3. 1つ目の文字列に対してループ処理を

  2. Pythonで共通しない文字のみを連結した文字列を作成する方法

    この記事では、2つの文字列が与えられたときに、まず一方の文字列から両方に共通する文字をすべて取り除き、続いてもう一方の文字列にのみ含まれる文字を、前者にのみ含まれる文字と連結して新しい文字列を作成する方法を解説します。 具体例 入力 >> 文字列1:AABCD     文字列2:MNAABP 出力 >> CDMNP この例では、「A」と「B」が両方の文字列に共通しているため除外されます。残った文字列1側の「C」「D」と、文字列2側の「M」「N」「P」を連結すると、最終的な出力は「CDMNP」になります。 アルゴリズム uncommonstring(s1, s2)