动态规划之字符串分词

原创 2017年11月05日 19:46:02

(一)word-break

Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separated sequence of one or more dictionary words.
For example, given
s ="leetcode",
dict =["leet", "code"].
Return true because"leetcode"can be segmented as"leet code".

动态规划:划分为子问题
1. dp[j]:表示0-j可分,s[i][j]:表示i,j字符串在dict中
2. dp[j] = true,当dp[i]&s[i][j]

    bool wordBreak(string s, unordered_set<string> &dict) {
        vector<bool> dp(s.size()+1,false);
        dp[0] = true;
        for(int i = 0;i < s.size();i++)
           for(int j = i+1;dp[i]&&j<=s.size();j++)
                   if(dict.find(s.substr(i,j-i))!=dict.end()) dp[j] = true;
        return dp[s.size()];
    }

(二)work-break-ii

Given a string s and a dictionary of words dict, add spaces in s to construct a sentence where each word is a valid dictionary word.
Return all such possible sentences.
For example, given
s ="catsanddog",
dict =["cat", "cats", "and", "sand", "dog"].
A solution is["cats and dog", "cat sand dog"].

动态规划:后面的运算用到前面的结果,把一个问题分解成多个子问题
1. dp[j]:表示0-j可分,s[i][j]:标识i-j字符串在dict中
2. dp[j] = dp[i],s[i][j]为真,0<= i < j
3. 重复2步骤,直到s[0][i]为假且s[0][j]不可分,或s[0][j]为真

vector<string> v;
 vector<bool> *d;
 vector<string> wordBreak(string s, unordered_set<string> &dict) {
       d = new vector<bool>[s.length()];
       for(int i = 0;i < s.size();i++)
           for(int j = 0;j <s.size();j++)
               d[i].push_back(false);

       for(int i = 0;i<s.size();i++){
           for(int j = i;j<s.size();j++){
               if( dict.find(s.substr(i,j-i+1)) != dict.end()) d[i][j] = true;
           }
       }
      string t;
      wordBreakHelp(s.size()-1,s,t);
      return v;
 }
  void wordBreakHelp(int k,string s,string t){
      string t0;
      for(int i = k;i>=0;i--){
          t0 = t;
          if(d[i][k]){
              if(i != 0){
                t0 = " " + s.substr(i,k-i+1) + t0;
                wordBreakHelp(i-1,s,t0);  
              } 
              else {
                t0 = s.substr(i,k-i+1) + t0;
                v.push_back(t0);
              }
          }
      }
  }
版权声明:本文为博主原创文章,未经博主允许不得转载。

字符串计数(动态规划)

题目描述求字典序在s1和s2之间的,长度在len1到len2的字符串的个数,结果mod 1000007。输入描述: 每组数据包涵s1(长度小于100),s2(长度小于100),len1(小于1000...
  • u013124704
  • u013124704
  • 2016年04月16日 10:46
  • 1593

两个字符串的编辑距离-动态规划方法

概念 字符串的编辑距离,又称为Levenshtein距离,由俄罗斯的数学家Vladimir Levenshtein在1965年提出。是指利用字符操作,把字符串A转换成字符串B所需要的最少操作数。其中...
  • ac540101928
  • ac540101928
  • 2016年10月11日 11:51
  • 8192

动态规划(5)字符串相似度算法

【GOOGLE2013校招第3道大题】 2.3 给定一个原串和目标串,只能对源串进行如下操作: 1.在给定位置插入一个字符 2.替换任意字符 3.删除任意字符 要求写一个程序,返回最少的...
  • cao478208248
  • cao478208248
  • 2014年09月03日 16:39
  • 1555

中文分词语言模型和动态规划

目前为止,中文分词包括三种方法:1)基于字符串匹配的分词;2)基于理解的分词;3)基于统计的分词。到目前为止,还无法证明哪一种方法更准确,每种方法都有自己的利弊,有强项也有致命弱点。 综合这几种...
  • hover_online
  • hover_online
  • 2011年11月13日 00:09
  • 1435

动态规划的中文分词方法

动态规划的中文分词方法
  • pennyliang
  • pennyliang
  • 2010年07月07日 09:04
  • 2666

动态规划和中文分词

动态规划dynamical programming,简称dp。了解它请参考《数学之美》第12章和《算法导论》第2版第15章,这里就不重复了。 《算法导论》第15章的“装配线调度”问题是非常好的dp学...
  • u011539200
  • u011539200
  • 2014年03月20日 10:25
  • 2006

中文分词原理和实现

三大主流分词方法:基于词典的方法、基于规则的方法和基于统计的方法。1、基于规则或词典的方法 定义:按照一定策略将待分析的汉字串与一个“大机器词典”中的词条进行匹配,若在词典中找到某个字符串,则匹配...
  • shibing624
  • shibing624
  • 2016年06月17日 11:22
  • 15772

动态规划之字符串操作

给定两个字符串A、B,计算将A转换成B所需的最小代价。每次操作可以删除、插入、替换其中一个字符。...
  • gkk000
  • gkk000
  • 2017年07月27日 12:45
  • 169

暗黑的字符串-动态规划

一个只包含'A'、'B'和'C'的字符串,如果存在某一段长度为3的连续子串中恰好'A'、'B'和'C'各有一个,那么这个字符串就是纯净的,否则这个字符串就是暗黑的。例如: BAACAACCBAAA ...
  • Andrewseu
  • Andrewseu
  • 2017年03月25日 10:19
  • 341

百练-4122 切割回文(动态规划)

子问题: 假设j 最优解切割,判断前j-1个所能达到的最少切割数加1与当前前i个的大小 状态:dp[i] 方程:dp[i] = min(dp[i],dp[j-1]+1); 代码如下: ...
  • huatian5
  • huatian5
  • 2016年07月26日 10:55
  • 468
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:动态规划之字符串分词
举报原因:
原因补充:

(最多只允许输入30个字)