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

C ++で単語のセットを同じ長さの行に変換することにより、単語のセットを正当化するプログラム


単語のリストと幅kがあるとすると、各行の文字数が正確にkで、テキストが完全に揃えられるようにテキストを配置する必要があります。ここでは、各行に挿入できる限り多くの単語をパックします。また、必要に応じて余分なスペースを埋めて、各行が正確にk文字になるようにします。

ここでは、単語間の余分なスペースをできるだけ均等に配置する必要があります。 1行のスペースの数が単語間で均等に分割されていない場合、左側の空のスロットには、右側のスロットよりも多くのスペースが割り当てられます。テキストの最後の行は、左揃えにし、単語の間に余分なスペースを挿入しないでください。

したがって、入力が["The"、 "grumpy"、 "wizards"、 "make"、 "toxic"、 "brew"、 "for"、 "the"、 "evil"、 "queen"、"and"のような場合、"ジャック"]、およびk =13

その場合、出力は-

になります
The grumpy
wizards make
toxic brew
for the evil
queen and
Jack

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

  • resultという1つの配列を作成します
  • 範囲0からaのサイズのiの場合、iをjで更新します
    • 幅:=0
    • 範囲iからaのサイズおよび幅+aのサイズ[j]+j – i <=b、
        のjの場合
      • 幅:=幅+a[j]のサイズ
    • スペース:=1、追加:=0
    • j – 1!=1かつj!=aのサイズの場合、
      • スペース:=(b-幅)/ j – i – 1
      • extra:=(b-width)mod(j – i – 1)
    • line:=a [i]
    • i+1からjの範囲のkの場合
      • 空白スペースのスペース番号を行で連結します
      • 余分な>0の場合は、スペースを線で連結します
      • 余分に1つ減らします
      • line:=a[k]をlineと連結します
    • x:=行のサイズ
    • line:=行で(b-x)個のスペースを連結します
    • 結果に行を挿入
  • return res

例(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;
}
void print_vector(vector<vector<auto> > v){
   cout << "[";
   for(int i = 0; i<v.size(); i++){
      cout << "[";
      for(int j = 0; j <v[i].size(); j++){
         cout << v[i][j] << ", ";
      }
      cout << "],";
   }
   cout << "]"<<endl;
}
class Solution {
   public:
   vector<string> fullJustify(vector<string> &a, int b) {
      vector <string> result;
      int i, j;
      for(i = 0; i < a.size(); i = j){
         int width = 0;
         for(j = i; j < a.size() && width + a[j].size() + j - i <= b; j++){
            width += a[j].size();
         }
         int space = 1;
         int extra = 0;
         if(j - i != 1 && j != a.size()){
            space = (b - width) / (j - i - 1);
            extra = (b - width) % (j - i - 1);
         }
         string line(a[i]);
         for(int k = i + 1; k < j; k++){
            line += string(space, ' ');
            if(extra-- > 0){
               line += " ";
            }
            line += a[k];
         }
         int x = line.size();
         line += string(b - x, ' ');
         result.push_back(line);
      }
      return result;
   }
};
main(){
   vector<string> v = {"The", "grumpy", "wizards", "make", "toxic", "brew", "for", "the", "evil", "queen", "and", "Jack"};
   Solution ob;
   print_vector(ob.fullJustify(v, 13));
}

入力

["I", "love", "coding.", "here", "we", "will", "write", "some", "program"]
16

出力

[The grumpy,
wizards make,
toxic brew,
for the evil,
queen and,
Jack ,]

  1. STLにSet_Intersectionを実装するC++プログラム

    2つのセットの共通部分は、両方のセットに共通する要素によってのみ形成されます。関数によってコピーされる要素は、常に同じ順序で最初のセットから取得されます。両方のセットの要素はすでに注文されている必要があります。 一般的な集合演算は-です セットユニオン 交差点を設定 対称集合の差または排他的論理和 差または減算を設定 アルゴリズム Begin    Declare set vector v and iterator st.    Initialize st = set_intersection (set1, set1 + n, set2, s

  2. STLにSet_Differenceを実装するC++プログラム

    2つのセットの違いは、2番目のセットではなく、最初のセットに存在する要素によってのみ形成されます。関数によってコピーされる要素は、常に同じ順序で最初のセットから取得されます。両方のセットの要素はすでに注文されている必要があります。 一般的な集合演算は-です セットユニオン 交差点を設定 対称集合の差または排他的論理和 差または減算を設定 アルゴリズム Begin    Declare set vector v and iterator st.    Initialize st = set_difference (set1, set1 + n,