微软谷歌的一道面试题:如何分隔没有空格标点的英文句子

success041000 2011-05-26 04:19:14
加精
给你一个没有间隔的字符串“thisisasentence”,如何将他分割成如下的句子:“this is a sentence”。
提供一个函数用来检验一个字符串是不是单词:bool dic(char* w);
完成下列的函数。要求效率尽可能快。
bool Detect(char* str)
{

}

尽量写出完整思路,最好有伪代码。
...全文
20734 273 打赏 收藏 转发到动态 举报
写回复
用AI写文章
273 条回复
切换为时间正序
请发表友善的回复…
发表回复
ssd189 2012-05-23
  • 打赏
  • 举报
回复
已经说了是回溯和递归了.

//分词函数
parse(str)
for i = 1 to str.length
substr = str.sub(1, i) //取子串
if(dic(substr)) //dic是楼主给的函数
set = parse(str.left) //解析剩下的部分
if(!set.error) //解析结果没有错误, 返回结果
return substr + set

return error //遍历所有, 依然得不到正确解析, 返回错误标识.
ssd189 2012-05-23
  • 打赏
  • 举报
回复
已经说了是回溯加递归了.



//分词函数
parse(str)
for i = 1 to str.length
substr = str.sub(1, i)
if(dic(substr)) //dic是楼主给的函数
set = parse(str.left)
if(!set.error)
return substr + set

return error
索隆 2012-05-07
  • 打赏
  • 举报
回复
你要写个函数就能判断一个字符串是不是单词,那lucene真是个天大的笑话
索隆 2012-05-07
  • 打赏
  • 举报
回复
你要写个函数就能判断一个字符串是不是单词,那lucene真是个天大的笑话
Dancing_Sea 2012-03-16
  • 打赏
  • 举报
回复
NVC 字典树 + 图 就OK了。阴文还是比较好处理,不像中文词组可以随意组合。

上面有个仁兄提到,下雨天留客天留我不留,这个可以组合出多个符合逻辑的意思出来。目前所有的分词算法都不能够解决这种分词。
幽灵光影 2011-10-25
  • 打赏
  • 举报
回复
正好遇到这个问题 学习了
programlove 2011-08-30
  • 打赏
  • 举报
回复
个人感觉这就是一个推理题,
程序的判断逻辑是: 前面的那些(或者一个)都是单词,并且后面的字符串也是单词;如果不成立,请回溯。
无论正向还是反向都是一样道理。
giant1st 2011-07-18
  • 打赏
  • 举报
回复
代码如下,VC2005运行成功:
// test.cpp : Defines the entry point for the console application.
//

/*http://topic.csdn.net/u/20110526/16/e33f016b-f188-42b7-afce-b4eca9e3546d.html
给你一个没有间隔的字符串“thisisasentence”,如何将他分割成如下的句子:“this is a sentence”。
提供一个函数用来检验一个字符串是不是单词:bool dic(char* w);
完成下列的函数。要求效率尽可能快。
bool Detect(char* str)
{

}
*/
#include "stdafx.h"
#include <iostream>
using namespace std;
#include "string.h"


#define MAX_WORD_COUNT 5
#define MAX_DIVIDE 10
#define MAX_WORD_LENGTH 30
int num[MAX_WORD_COUNT]={0};
int divide[MAX_DIVIDE] = {0};
#define FALSE 0
#define TRUE 1
int ii=0, jj=0;
/* If w is a word, store the number of characters in num[] Array.
* Number of the cases where w can stand for a word is stored in a int, which is marked by the pointer pCnt*/
bool dic(char* w, int* pCnt)
{
int i=0, j=0;
bool flag = FALSE;
for (i=0; i<MAX_WORD_COUNT; ++i)
{
num[i]=0;
}
int test=0;
if (!(strncmp(w, "this", strlen("this"))))
{
num[j++] = 4;
++(*pCnt);
flag = TRUE;
}
if (!strncmp("is", w, strlen("is")))
{
num[j++] = 2;
++(*pCnt);
flag = TRUE;
}
if (!strncmp("a", w, strlen("a")))
{
num[j++] = 1;
++(*pCnt);
flag = TRUE;
}
if (!strncmp("sentence", w, strlen("sentence")))
{
num[j++] = 8;
++(*pCnt);
flag = TRUE;
}
if (!strncmp("sent", w, strlen("sent")))/*test case*/
{
num[j++] = 4;
++(*pCnt);
flag = TRUE;
}
return flag;
}

bool Detect(char* str)
{

int cnt_tmp = 0;

if (*str == '\0')
{
return TRUE;
}
if (dic(str, &cnt_tmp))
{
divide[jj++] = num[ii];
for (ii=0; ii < cnt_tmp; ++ii)
{
if (Detect(&str[num[ii]]))
{
return TRUE;
}
else
{
divide[--jj] = 0;
}
}
}
return FALSE;
}

int main()
{
/* print*/
int* pDiv=divide;
char* pCh="thisisasentence";
char tmp[MAX_WORD_LENGTH];

memset(divide, 0, MAX_DIVIDE*sizeof(int));

if (Detect(pCh))
{
while (*pDiv)
{
memset(tmp, 0, MAX_WORD_LENGTH);
strncpy(tmp, pCh, *pDiv);
printf("%s ", tmp);
pCh = pCh+(*pDiv);
++pDiv;
}
printf("\n");
}
return 0;
}
flyforfei 2011-06-29
  • 打赏
  • 举报
回复
假如现在有一个全部英文单词的SQL数据库,能不能做到呢?
linghuchong001 2011-06-09
  • 打赏
  • 举报
回复
进来看高手解答
Paradin 2011-06-09
  • 打赏
  • 举报
回复
觉得就是回溯啊
linshenqi 2011-06-09
  • 打赏
  • 举报
回复
首先得有个词库吧,然后就要自然语言匹配了
guopeixi 2011-06-08
  • 打赏
  • 举报
回复
有意思,可以试试,分析出每个可能的单词不是问题,只要有强大的单词库就可以(挨个比对),这个好实现,关键是语义分析,分析出单词来,还得语义正确,个人想法是把所有可能的单词组合全都列出来,然后最好有个语法库,在用语法库来分析所有可能的句子,结果1,没有一句是人话;2,一句是人话;3,好多句人话,如果没有上下文的话,顶多到这里了,胡言乱语了一通,各位莫怪
smkalen 2011-06-08
  • 打赏
  • 举报
回复
字符串是固定的,直接分割数组是最快的方法,楼上的高手们是不是想多了?
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 szdufeng 的回复:]

如果有人认为这个问题很容易解决,那他是天才,我认为这是自然语言处理的关键问题
[/Quote]
++

很多被绑死在“thisisasentence"这个例子上,直接return "this is a sentence";
new_born2006 2011-06-08
  • 打赏
  • 举报
回复
分词算法瑟,没难度。。。
BlueSky4014 2011-06-08
  • 打赏
  • 举报
回复
关注下,我也想知道结果
blackneck 2011-06-07
  • 打赏
  • 举报
回复
bool dic(char* w);
学习这个函数实现
bluestar9 2011-06-07
  • 打赏
  • 举报
回复
怎么判断是不是一个单词呢????
淡淡如水 2011-06-07
  • 打赏
  • 举报
回复
原因是:很简单,但是算法要优化的
加载更多回复(253)

33,010

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧