编程算法 - 字典分词 代码(C)
字典分词 代码(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)的更多相关文章
- 编程算法 - 分割数 代码(C)
分割数 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 有n个无差别的物品, 将它们划分成不超过m组, 求出划分方法数模M的余数. 比如: n= ...
- 编程算法 - 数丑陋 代码(C)
数丑陋 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 我们把仅仅包括因子2, 3 和 5的数称作丑数. 求按从小到大的顺序的第5个丑数. 能够 ...
- 编程算法 - 区间调度问题 代码(C)
区间调度问题 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 有n项工作, 每项工作分别在s时间開始, 在t时间结束. 对于每项工作能够选择參与 ...
- 编程算法 - 切割排序 代码(C)
切割排序 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 排序切割, 把一个数组分为, 大于k\小于k\等于k的三个部分. 能够使用高速排序的Parti ...
- 编程算法 - 二部图确定 代码(C)
二部图确定 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 给定一个具有n个顶点的图. 要给图上每一个顶点染色, 而且要使相邻的顶点颜色不同. ...
- 编程算法 - 全然背包问题 代码(C)
全然背包问题 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 有n个重量和价值分别为w,v的物品, 从这些物品中挑选出总重量不超过W的物品, 求 ...
- 编程算法 - 远征队(expedition) 代码(C)
远征队(expedition) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 远征队有一辆卡车须要行驶L单位的距离, 開始时, 车上有P单位的 ...
- 游戏编程算法与技巧 Game Programming Algorithms and Techniques (Sanjay Madhav 著)
http://gamealgorithms.net 第1章 游戏编程概述 (已看) 第2章 2D图形 (已看) 第3章 游戏中的线性代数 (已看) 第4章 3D图形 (已看) 第5章 游戏输入 (已看 ...
- 对一致性Hash算法,Java代码实现的深入研究
一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读一文中"一致性Hash算法"部分,对于为什么要使用一致性Hash算法.一致性 ...
随机推荐
- quartz 2.1学习(一)
quartz是一种开源任务调度框架,提供了强大的任务调度机制,Quartz允许开发人员灵活地定义触发器的调度时间表,并可对触发器和任务进行关联映射.废话不多说了,介绍一下编程的基本步骤: 实现Job接 ...
- Swift - 内存泄露原因(循环强引用)及解决办法
Swift使用自动引用计数(ARC)来管理应用程序的内存使用.在大多是情况下,并不需要考虑内存的管理.当实例不再需要的时候,ARC会自动释放这些实例所使用的内存. 但ARC并不是绝对安全的.下面两种情 ...
- kernel hexdump分析
驱动调试中,很多时候是二进制的,这个时候hexdump就是个非常有用的工具了. 不要再自己去实现类似的功能,kernel代码里面就有: 参考: kernel/lib/hexdump.c // 0Xxx ...
- Perl BEGIN块和END块
[root@wx03 5]# cat a5.pl END {print cccccccccccc."\n"}; print "aaaaaaaaaaaaa\n"; ...
- 《Linux命令行与shell脚本编程大全》 第十八章 学习笔记
第十八章:初识sed和gawk 文本处理 sed编辑器 sed编辑器可以基于输入到命令行的或是存储在命令文本文件中的命令来处理数据流中的数据. 它每次读取一行,用提供的编辑器命令匹配数据.按命令中指定 ...
- 【数据库摘要】12_Sql_存储过程
SQL 存储过程 存储过程创建语法: create or replace procedure 存储过程名(param1 in type,param2 out type) as 变量1 类型(值范围); ...
- ios添加pre和post build action
再vs中,我们可以很方便的再build前.后执行一些脚本为我们做点什么事情.再ios中怎么搞呢,哪必然是对xcode进行操作了.再google搜索了一把,有说操作Scheme的也有说再直接再targe ...
- 【WPF】监听WPF的WebBrowser控件弹出新窗口的事件
原文:[WPF]监听WPF的WebBrowser控件弹出新窗口的事件 WPF中自带一个WebBrowser控件,当我们使用它打开一个网页,例如百度,然后点击它其中的链接时,如果这个链接是会弹出一个新窗 ...
- 使用CUNIT测试
使用CUNIT测试 一:概述 CUnit是一个c语言的单元测试框架,它是以静态链接库的形式,连接到用户代码中的,主要的功能就是提供了语义丰富的断言和多种测试结果输出接口,可以方便地生成测试报告. 但是 ...
- 获取ocx运行路径的另一种方法
在InitInstance里边可以获取 1 2 3 4 5 6 7 8 9 10 11 12 if (bInit) { // TODO: 在此添加您自己的模块初始化 ...