编程算法 – 字典分词 代码(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)
上一篇 2021年12月15日 下午4:00
下一篇 2021年12月15日 下午4:00


相关推荐

  • spring整合log4j_spring连接数据库的配置

    spring整合log4j_spring连接数据库的配置常用日志框架log4j、log4j2(log4j的升级版,最常用的)、logback(spring boot默认)、Jboss-logging…等slf4 是日志接口规范,代码对接slf4,实现和具体日志框架解耦,无需修改编码即可切换日志框架。修改pom依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-st

    2022年8月8日
    4
  • 【转】Myeclipse 查看Jar文件里面源码中文乱码 问题解决

    【转】Myeclipse 查看Jar文件里面源码中文乱码 问题解决

    2021年8月28日
    77
  • 文件上传

    文件上传

    2026年3月13日
    2
  • PetaLinux学习笔记 1

    PetaLinux学习笔记 1迟迟没有做底板,所以只能把Linux写到FLASH上了。还好这个FLASH够大。官方所说的有点问题,最后一句改成petalinux-package–boot–fsbl~/FTP_Folder/ax_peta/images/linux/zynq_fsbl.elf–fpga–u-boot–kernel–force再烧进去就可以跑了。手册ug821有说明,先搞清楚它…

    2025年11月1日
    6
  • 位运算符按位取反_计算机基础常见问题讨论

    位运算符按位取反_计算机基础常见问题讨论程序中的所有数在计算机内存中都是以二进制的形式储存的。位操作是程序设计中对位模式或二进制数的一元和二元操作。在许多古老的微处理器上,位运算比加减运算略快,通常位运算比乘除法运算要快很多。在现代架构中,情况并非如此:位运算的运算速度通常与加法运算相同(仍然快于乘法运算)。(摘自维基百科)位运算对CPU很友好,是一种程序优化手段,也是大厂面试中常常会提及的话题。在日常的编程中用到为运算,也是可以实现许…

    2022年8月14日
    5
  • mac idea2022.01 激活【最新永久激活】

    (mac idea2022.01 激活)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~747EFQ8BIF-eyJsaWNlbnNlSWQiOi…

    2022年3月31日
    356

发表回复

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

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