编程算法 – 字典分词 代码(C)

编程算法 – 字典分词 代码(C)

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

全栈程序员社区此处内容已经被作者隐藏,请输入验证码查看内容
验证码:
请关注本站微信公众号,回复“验证码”,获取验证码。在微信里搜索“全栈程序员社区”或者“www_javaforall_cn”或者微信扫描右侧二维码都可以关注本站微信公众号。

字典分词 代码(C)


本文地址: http://blog.csdn.net/caroline_wendy


给定字典, 给定一句话, 进行分词. 

使用深度遍历(DFS)的方法.

使用一个參数string, 保存当前分支的分词后的句子; 使用一个參数vector, 保存全部可能的组合.

使用一个验证函数, 推断句子能否够分词.


代码:

/*
 * main.cpp
 *
 *  Created on: 2014.9.18
 *  Author: Spike
 *  Copyright (c) 2014年 WCL. All rights reserved.
 */

/*eclipse cdt, gcc 4.8.1*/

#include <iostream>
#include <vector>
#include <string>
#include <set>

using namespace std;

bool Match(string s, string m) {
	int l = m.length();
	if (s.substr(0, l) == m) {
		return true;
	}
	return false;
}

bool Validate(string s, vector<string> &dict) {
	//1. calculate all alphabets in the query
	set<char> sc;
	for (size_t i = 0; i < s.length(); i++) {
		sc.insert(s[i]);
	}
	//2. calculate all alphabets in the dictionary
	set<char> dc;
	for (vector<string>::iterator it = dict.begin();
			it != dict.end(); it++)
	{
		for (size_t i = 0; i < (*it).length(); i++) {
			dc.insert((*it)[i]);
		}
	}
	for (set<char>::iterator it = sc.begin(); it != sc.end(); it++) {
		if (dc.find(*it) == dc.end()) {
			return false;
		}
	}
	return true;
}

string Split(string s, vector<string> &dict, string cur, vector<string>& list) {
	if (s.length() == 0) {
		list.push_back(cur);
		return s;
	}
	for (vector<string>::iterator it = dict.begin(); it != dict.end(); it++) {
		if (Match(s, *it)) {
			string tmp = cur;
			string latter = s.substr(it->length(), s.length() - it->length());
			cur += (*it) + "~"; // add current word to cur_str
			cur += Split(latter, dict, cur, list); // split remaining words
			cur = tmp; //back to last status
		}
	}
	return "No Result";
}

vector<string> SplitWords(string s, vector<string> &dict) {
	string cur = "";
	vector<string> list;
	if (!Validate(s, dict)) {
		return list;
	}
	Split(s, dict, cur, list);
	return list;
}


int main()
{
    vector<string> dict={"程序猿","公务员","员","我","喜","做","程序","一","欢","喜欢","做一个","一个"};
    vector<string> words = SplitWords("我喜欢做一个程序猿", dict);
    for (vector<string>::iterator it=words.begin(); it!=words.end(); it++) {
        cout<<(*it)<<endl;
    }
    return 0;
}

简化版本号(没有验证):

/*
 * main.cpp
 *
 *  Created on: 2014.9.18
 *  Author: Spike
 *  Copyright (c) 2014年 WCL. All rights reserved.
 */

/*eclipse cdt, gcc 4.8.1*/

#include <iostream>
#include <vector>
#include <string>
#include <set>

using namespace std;

bool Match(string s, string m) {
	int l = m.length();
	if (s.substr(0, l) == m) {
		return true;
	}
	return false;
}

string Split(string s, vector<string> &dict, string cur, vector<string>& list) {
	if (s.length() == 0) {
		list.push_back(cur);
		return s;
	}

	for (vector<string>::iterator it = dict.begin(); it != dict.end(); it++) {
		if (Match(s, *it)) {
			string tmp = cur;
			string latter = s.substr(it->length());
			cur += (*it) + " | "; // add current word to cur_str
			cur += Split(latter, dict, cur, list); // split remaining words
			cur = tmp; //back to last status
		}
	}

	return "No Result";
}

vector<string> SplitWords(string s, vector<string> &dict) {
	string cur = "";
	vector<string> list;
	Split(s, dict, cur, list);
	return list;
}


int main()
{
    vector<string> dict={"程序猿","公务员","员","我","喜","做","程序","一","欢","喜欢","做一个","一个"};
    string s = "我喜欢做一个程序猿";
    vector<string> words = SplitWords(s, dict);
    for (vector<string>::iterator it=words.begin(); it!=words.end(); it++) {
        cout<<(*it)<<endl;
    }
    return 0;
}

输出:

我~喜~欢~做~一个~程序猿~
我~喜~欢~做~一个~程序~员~
我~喜~欢~做一个~程序猿~
我~喜~欢~做一个~程序~员~
我~喜欢~做~一个~程序猿~
我~喜欢~做~一个~程序~员~
我~喜欢~做一个~程序猿~
我~喜欢~做一个~程序~员~

编程算法 - 字典分词 代码(C)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/117972.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Vue最简洁最全的入门教程

    Vue最简洁最全的入门教程最近在学vue,主要从以下几个方面学习:•环境安装•模板语法(怎么写)•指令•选项、生命周期(写在哪儿)•vuejs-devtools(怎么调试)1.Vue.js简介Vue.js是一套构建用户界面的UI框架,它专注于MVVM模型的ViewModel层,通过双向数据绑定把View层和Model层链接起来。2.Vue.js特点•模板双向绑定机制•利用指令…

    2022年5月4日
    49
  • 博主在阿里笔试中拿了0分,竟是因为分不清楚 Java 输入类 nextLine 与 next 两个方法的区别「建议收藏」

    博主在阿里笔试中拿了0分,竟是因为分不清楚 Java 输入类 nextLine 与 next 两个方法的区别「建议收藏」前言以前做算法题,都是实现一个方法,需要的参数会在方法参数中直接给出,而且需要的返回值直接在方法中return就好了。但是,这次阿里笔试,让博主遭遇百万点暴击,需要的参数居然要到输入流中读取,而且返回结果居然直接输出到控制台上!由于没有见过这种套路,博主的心态极差,且十分惊奇地发现,当使用Java输入类nextLine方法读取输入流中的字符串时,总会莫名其妙地少读一部分!然后…

    2022年5月10日
    40
  • 女生学java_Java Server Pages

    女生学java_Java Server Pages/*身份证号码的结构和表示形式<br>1、号码的结构<br>公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。<br>2、地址码<br>表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T2260的规定执行。<br>3、出生日期码&

    2022年8月31日
    3
  • xshell下载安装教程_xshell命令连接ip

    xshell下载安装教程_xshell命令连接ipxshell下载链接:  http://www.netsarang.com/download/free_license.html         现今软件市场上有很多终端工具,比如:secureCRT、Putty、telnet、xshell\等等。secureCRT是一款很强大的终端工具,但是,它毕竟是收费软件,在公司里不允许使用。而且在自己的电脑里一旦输入大写,整个界面就乱了(原因未知,未…

    2025年10月16日
    2
  • java的遍历数组效率测试源码[通俗易懂]

    java的遍历数组效率测试源码[通俗易懂]packagejavatest;importjava.util.ArrayList;importjava.util.Iterator;importjava.util.List;publicclassjavatest{ publicstaticvoidmain(String[]args){ Listlist=newArrayList(); l

    2025年11月23日
    7
  • JavaWeb图表插件的小研究[通俗易懂]

    JavaWeb图表插件的小研究

    2022年1月24日
    50

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号