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

C++でのパズルの前後


フレーズのリストがあるとし、パズルの前後のリストを生成します。ここでのフレーズは、小文字とスペースのみで構成される文字列です。開始位置と終了位置にスペースはありません。フレーズに連続したスペースはありません。

前後のパズルは、最初のフレーズの最後の単語が2番目のフレーズの最初の単語と同じである2つのフレーズをマージすることによって形成されるフレーズです。 2つのフレーズphrases[i]とphrases[j]ごとに形成できるBeforeとAfterのパズルを見つける必要があります。ここでI!=jです。 2つのフレーズを一致させる順序が重要であることに注意してください。両方の順序を考慮します。

辞書式順序で並べ替えられた個別の文字列のリストを見つける必要があります。したがって、入力がフレーズのようなものである場合=["ミッションステートメント"、 "簡単に食べる"、 "古いブロックのチップ"、 "チョコレートバー"、 "ミッション不可能"、 "ミッションの男"、 "ブロックパーティー」、「私の言葉を食べる」、「石鹸のバー」]、出力は次のようになります:[「古いブロックパーティーのチップ」、「ミッション不可能な男」、「ミッションステートメントの男」 "、"私の言葉を一口食べる "、"石鹸のチョコレートバー"]。

これを解決するには、次の手順に従います-

  • 文字列の配列を定義し、フレーズの配列を並べ替えます

  • マップを定義するm、n:=フレーズ配列のサイズ

  • 0からn–1の範囲のIの場合

    • s:=phrases [i]、rspace:=右側からの空白のインデックス

    • mに配置されたリストにIを挿入します[rspaceがnullの場合はs、それ以外の場合はrspace+1までのsの部分文字列を検索します]

  • 0からn–1の範囲のIの場合

    • s:=phrases [i] lspace:=左側からの空白のインデックス

    • x:=lspaceがnullの場合はs、それ以外の場合は0からlspaceまでのsの部分文字列を検索します]

    • mがキーとしてxを持っている場合

      • v:=m [x]

      • 0からvのサイズまでの範囲のjの場合

        • v [j]がIでない場合、

          • フレーズ[v[j]]+ sの部分文字列(xのサイズまで)をretに挿入します

  • 並べ替えret

  • retの一意を削除してretを返す

例(C ++)

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

#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<auto> v){
   cout << "[";
   for(int i = 0; i<v.size(); i++){
      cout << v[i] << ", ";
   }
   cout << "]"<<endl;
}
class Solution {
public:
   vector<string> beforeAndAfterPuzzles(vector<string>& phrases) {
      vector <string> ret;
      sort(phrases.begin(), phrases.end());
      unordered_map <string, vector <int> > m;
      int n = phrases.size();
      for(int i = 0; i < n; i++){
         string s = phrases[i];
         auto rspace = s.rfind(' ');
         m[rspace == string::npos ? s : s.substr(rspace + 1)].push_back(i);
      }
      for(int i = 0; i < n; i++){
         string s = phrases[i];
         auto lspace = s.find(' ');
         string x = (lspace == string::npos? s : s.substr(0, lspace));
         if(m.count(x)){
            vector <int>& v = m[x];
            for(int j = 0; j < v.size(); j++){
               if(v[j] != i){
                  ret.push_back(phrases[v[j]] + s.substr(x.size()));
               }
            }      
         }
      }
      sort(ret.begin(), ret.end());
      ret.erase(unique(ret.begin(), ret.end()), ret.end());
      return ret;
   }
};
main(){
   vector<string> v = {"mission statement","a quick bite to eat","a chip off the old block","chocolate bar","mission impossible","a man on a mission","block party","eat my words","bar of soap"};
   Solution ob;
   print_vector(ob.beforeAndAfterPuzzles(v));
}

入力

["mission statement","a quick bite to eat","a chip off the old block","chocolate bar","mission impossible","a man on a mission","block party","eat my words","bar of soap"]

出力

[a chip off the old block party, a man on a mission impossible, a man on a mission
statement, a quick bite to eat my words, chocolate bar of soap, ]

  1. CSSの::beforeおよび::after疑似要素

    CSS::beforeとCSS::after Pseudo-elementは、要素の前後にそれぞれコンテンツを挿入するために使用されます。 例 CSS::beforeとCSS::after疑似要素の例を見てみましょう- <!DOCTYPE html> <html> <head> <style> div:nth-of-type(1) p:nth-child(2)::after {    content: " BUZZINGA!";    background: orange;  

  2. Macを再フォーマットする前後に行う5つのこと

    Macのハードドライブをワイプすることは、数年前とは別の作業です。 macOS Big Surを使用している場合は、リカバリツールがあります。そのため、Macの再フォーマットは最近の過去よりも簡単です。 この投稿では、Macを再フォーマットする前に行うべきことのチェックリストを提供します。その前に、macOSリカバリツールの概要を説明しましょう。 macOSリカバリツールの入門書 Appleは今、あなたのMacを再フォーマットするプロセスを簡単にしている。数年経つと、バックアップハードドライブ、Mac自動インストーラー、さらには物理リカバリディスクの間にスタンドオフが発生します。さらに、プ