ニュースクラスタ


中に入ると


これは実習が始まってから初めて本当に解決した問題です.夜家に帰って疲れてしおれている.だから勉強は朝にしました.
要するに、ニュースクラスタリングは文字を2つのセグメントに分けて、交差と合集を求めて、それから花の類似度を求める問題です.
まず文を大文字または小文字に変換し、substr()を使用して2つの文字をベクトルに分割し(この場合、2つの文字はすべてアルファベット)、合集と交差を求めればよい.
しかし、全く関係のない場所に遮られた.比較したテキストを削除する際に困難に遭遇しました.erase()関数を書く必要がありますが、変数として削除するデータを受け入れる場所を知っています.この時はどうやってその位置を探せばいいのか分からない.だから他のブログを調べたらfind()で得た変数をそのまま使いました.翁.このように書いても大丈夫ですか?私は彼にcout<

コードの説明


最初に文字列を小文字に変更します.
その後、2つの文字をtmpに別々に格納し、両方の文字がアルファベット小文字の場合にのみ、予め作成されたベクトルに格納します.全部で文字列が2つあるので、2回作ればいいです.
次のmaxには、生成されたベクトルのsize()を加えます.maxはアセンブリですが、アセンブリの要素個数が各アセンブリの要素個数の和であることを忘れずに、交差する要素個数を減算すればいいです.2つのベクトルが空の場合、2つの文字列に小文字が1つもない場合は、65536を乗じます.
そして集合を求めればいい.str 1 vのサイズがstr 2 vのサイズより大きい場合は、str 2 vの要素を1つ持って、同じ要素がstr 1 vにあるかどうかを確認するだけです.find関数が使用されます.次にstr 1 vに値があるかどうかを確認し、ある場合はマージセットのサイズを増やしてstr 1 vの対応する要素を削除することを忘れないでください.ここでstr 2 v要素を削除しましたが、最初の値が間違っていました.str 2 vの要素を1つずつ回転させ、str 1 vと比較するので、str 1 vの値をクリアする必要があります.もう一つ!見つかった一時値tmpは、erase()関数を書き込むときに直接入れることができます.なぜなら、tmpに値を入力する際に使用される関数find()は、要素を返すのではなくアドレスを返す(したがって、cout<<*findはfindで見つけた値を返し、cout<&findはアドレスを返す).だからerase()に直接書くことができます.
その他の場合,elseを用いて上のコードでベクトルを変更するだけでよい.
そして和セットmaxを求めるためにminを減算する.maxが0の場合(要素全体の個数が交差に等しい場合)?65536は車に戻る必要があります.これを外すと、該当する条件に該当すると分けられません.必ずやり遂げる
次に、minとmaxをダブルで除算すればよい.double型を使う理由は小数点が必要です.
最後に求めた値に65536を乗じて、戻ると終わります!この場合、別途変形する必要はありません.小数点を除いて求めることが要求されるので,int型は自動的に小数点を除いた点を利用する.

コード#コード#

#include <vector>
#include <algorithm>
#include <iostream>

using namespace std;

int solution(string str1, string str2) {
    int answer = 0;
    vector<string> str1_v;
    vector<string> str2_v;
    int max = 0;
    int min = 0;
    
    transform(str1.begin(), str1.end(), str1.begin(), ::tolower);
    transform(str2.begin(), str2.end(), str2.begin(), ::tolower);
    
    for(int i= 0; i<str1.length(); i++){
        string tmp = str1.substr(i, 2);
        if((tmp[0] >= 97 && tmp[0] <= 122) && (tmp[1] >= 97 && tmp[1] <= 122)){
            str1_v.push_back(tmp);
        }
    }
    
    for(int i= 0; i<str2.length(); i++){
        string tmp = str2.substr(i, 2);
        if((tmp[0] >= 97 && tmp[0] <= 122) && (tmp[1] >= 97 && tmp[1] <= 122)){
            str2_v.push_back(tmp);
        }
    }
    
    max = str1_v.size() + str2_v.size();
    
    if(str1.empty() && str2.empty()){
        return 65536;
    }
    
    if(str1_v.size() >= str2_v.size()){
        for(int i=0; i<str2_v.size(); i++){
            auto tmp = find(str1_v.begin(), str1_v.end(), str2_v[i]);
            cout << *tmp << " " << &tmp << endl;
            if(tmp != str1_v.end()){
                min++;
                str1_v.erase(tmp);
            }
        }
    }else{
        for(int i=0; i<str1_v.size(); i++){
            auto tmp = find(str2_v.begin(), str2_v.end(), str1_v[i]);
            if(tmp != str2_v.end()){
                min++;
                str2_v.erase(tmp);
            }
        }
    }
    
    max = max - min;
    
    if(max == 0){
        return 65536;
    }
    double j = (double)min/(double)max;
    answer = j * 65536;
    
    return answer;
}