查看: 2993|回复: 11
收起左侧

Google : 句子分割

|只看干货 |刷题
头像被屏蔽

分享帖子到朋友圈
wwwyhx | 显示全部楼层 |阅读模式
提示: 作者被禁止或删除 内容自动屏蔽

上一篇:表达式加括号使和最大
下一篇:计算括号排列种数
currahee 2011-5-31 21:02:08 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   0% (0)
 
 
0% (0)    👎
bool Detect(char* str)
{
  int wordBegin=0, wordEnd=0;
  char* newStr;
  while(wordBegin!=str.length()-1)
  {
    bool isWord=false;
    while(!isWord)
    {
      wordEnd++;
      isWord=dic(str.charAt(wordBegin), str.charAt(wordEnd));
      if(wordEnd==str.length()-1 && !isWord)
        return false;
    }
    newStr=newStr+str.substring(wordBegin, wordEnd)+" ";
    wordBegin=wordEnd;
  }
  str=newStr;
  return true;
}
回复

使用道具 举报

头像被屏蔽
 楼主| wwwyhx 2011-6-1 21:01:29 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

babyfrog 2011-7-7 01:47:59 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   100% (5)
 
 
0% (0)    👎
本帖最后由 babyfrog 于 2011-7-7 01:50 编辑

实际问题没那么简单吧@@比如扫描到“this”之后先看到“i”也是字典里的一个单词,然后扫描发现“sasentence”不是一个单词...用回朔才能找到所有可能性吧~
回复

使用道具 举报

stephenK 2011-7-9 15:05:43 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   100% (25)
 
 
0% (0)    👎
回复 4# babyfrog

是有歧义的问题,比如but和button。这里必须像huffman encoding一样,限定不可以有其他词的前缀码。 当然这道题考察的肯定不会这么难。
回复

使用道具 举报

stephenK 2011-7-9 15:07:33 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   100% (25)
 
 
0% (0)    👎
这位同学你把char* 当做 std::string用了。。


bool Detect(char* str)
{
  int wordBegin=0, wordEnd=0;
  char* newStr;
  while(wordBegin!=str.length()-1)
  {
    bool isWord=false;
    while(!isWord)
    {
      wordEnd++;
      isWord=dic(str.charAt(wordBegin), str.charAt(wordEnd));
      if(wordEnd==str.length()-1 && !isWord)
        return false;
    }
    newStr=newStr+str.substring(wordBegin, wordEnd)+" ";
    wordBegin=wordEnd;
  }
  str=newStr;
  return true;
}
currahee 发表于 2011-5-31 21:02
回复

使用道具 举报

头像被屏蔽
 楼主| wwwyhx 2011-7-12 21:52:33 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

darksteel 2011-7-13 03:21:48 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   100% (32)
 
 
0% (0)    👎
回复 7# wwwyhx
你的方法应该是对的,只不过那样递归复杂度太高。这题如果只要返回bool值的话,完全可以用DP,复杂度可以做到maxL*n,其中maxL是最长的单词的长度,最坏不超过n^2。
回复

使用道具 举报

头像被屏蔽
 楼主| wwwyhx 2011-7-15 15:46:15 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

darksteel 2011-7-16 02:53:56 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   100% (32)
 
 
0% (0)    👎
本帖最后由 darksteel 于 2011-7-16 03:01 编辑

回复 9# wwwyhx
类似这样:
  1. bool Detect(char *str)

  2. {

  3.     char *p, *q;

  4.     bool *can = new bool[strlen(str)+1];

  5.     can[0] = 1;

  6.     for(p = str; *p; p++) {

  7.         if(!can[p-str])

  8.             continue;

  9.         for(q = p; *q; q++)

  10.             if(dic(p, q))

  11.                 can[q-str+1] = true;

  12.     }

  13.     return can[strlen(str)];

  14. }
复制代码
can[ i ]代表从头开始共i个字符能否被分割。内存循环其实可以到maxL也就是字典中单词的最大长度就退出,所以复杂度可以到O(maxL*n)。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

隐私提醒:
■拉群请前往同学同事飞友|拉群结伴版块,其他版块拉群,帖子会被自动删除
■论坛不能删帖,为防止被骚扰甚至人肉,不要公开留微信等联系方式,请以论坛私信方式发送。
■特定版块可以超级匿名:https://tools.1point3acres.com/thread
■其他版块匿名方法:http://www.1point3acres.com/bbs/thread-405991-1-1.html

>
快速回复 返回顶部 返回列表