辞書を分詞にする

3252 ワード

最近は分詞が必要で、つまらないアルゴリズムを書く必要があります...
アルゴリズム:辞書と一言を与えて、分詞をします.
Target:辞書を入力し、可能なすべての分詞結果を出力します.
考え方:dfs
加速:まず、この言葉のすべての言葉が辞書にあるかどうかを判断します(validate)
//
//  Wordsplit.cpp
//  
//  Target: Find all possible splitting of a sentence given a dictionary dict
//  Howto:  refer to main
//
//  Created by Rachel on 14-8-16.
//  Copyright (c) 2014  ZJU. All rights reserved.
//

#include <iostream>
#include <stdio.h>
#include "vector"
#include <set>
#include<unordered_set>
using namespace std;

class Wordsplit {
private:
    vector<string> list;
    bool match(string s, string cur_ele){
        int l = cur_ele.length();
        if (s.substr(0,l)==cur_ele) {
            return true;
        }
        return false;
    }
    
    bool validate(string s, unordered_set<string> &dict){
        //1. calculate all alphabets in the query
        set<char> alpha;
        for (int i=0; i<s.length(); i++) {
            alpha.insert(s[i]);
            }
        //2. calculate all alphabets in the dictionary
        set<char> beta;
        unordered_set<string>::iterator dict_it;
        for (dict_it = dict.begin(); dict_it!=dict.end(); dict_it++) {
            for (int i=0; i<(*dict_it).length(); i++) {
                beta.insert((*dict_it)[i]);
            }
        }
        set<char>::iterator it;
        for (it = alpha.begin(); it!=alpha.end(); it++) {
            if (beta.find(*it)==beta.end()) {
                return false;
            }
        }
        return true;
    }
    
public:
    string split(string s, unordered_set<string> &dict, string cur_str){
        if (s.length()==0) {
            list.push_back(cur_str.substr(0,cur_str.length()-1));
            return s;
        }
        //cout<<s<<endl;
        unordered_set<string>::iterator it;
        for (it=dict.begin(); it!=dict.end(); it++) {
            if (match(s, (*it))) {
                string tmp_str = cur_str;
                string latter = s.substr(it->length(), s.length()-it->length());
                cur_str += (*it) + " "; // add current word to cur_str
                cur_str += split(latter, dict, cur_str); // split remaining words
                cur_str = tmp_str; //back to last status
            }
        }
        return "no result";
    }
    
    
    vector<string> main(string s, unordered_set<string> &dict) {
        if (!validate(s, dict)) {
            return list;
        }
        split(s, dict, "");
        return list;
    }
};

int main()
{
    Wordsplit s;
    unordered_set<string> L={"   ","   "," "," "," "," ","  "," "," ","  ","   ","  "};
    vector<string> V = s.main("         ", L);
    vector<string>::iterator it;
    for (it=V.begin(); it!=V.end(); it++) {
        cout<<(*it)<<endl;
    }
}

出力:
私はプログラマーになるのが好きです.
私はプログラマーになるのが好きです.
私はプログラマーになるのが好きです.
私はプログラマーになるのが好きです.
私はプログラマーになるのが好きです.
私はプログラマーになるのが好きです.
私はプログラマーになるのが好きです.
私はプログラマーになるのが好きです.