[译]单词分割

简介: 原文链接: 单词分割给定一个字符串s和一个单词字典,确定是否可以将s分割为一个或多个字典单词的空格分隔的序列。例如:For example, givens = "leetcode",dict = ["leet", "code"].因为"leetcode"可以分割为"leet code", 所以返回true.普通方法这个问题可以用一种简单的方法来解决。

原文链接: 单词分割

给定一个字符串s和一个单词字典,确定是否可以将s分割为一个或多个字典单词的空格分隔的序列。
例如:

For example, given
s = "leetcode",
dict = ["leet", "code"].

因为"leetcode"可以分割为"leet code", 所以返回true.

  1. 普通方法
    这个问题可以用一种简单的方法来解决。讨论总是可以从这个开始。
public class Solution {
    public boolean wordBreak(String s, Set<String> dict) {
             return wordBreakHelper(s, dict, 0);
    }
 
    public boolean wordBreakHelper(String s, Set<String> dict, int start){
        if(start == s.length()) 
            return true;
 
        for(String a: dict){
            int len = a.length();
            int end = start+len;
 
            //end index should be <= string length
            if(end > s.length()) 
                continue;
 
            if(s.substring(start, start+len).equals(a))
                if(wordBreakHelper(s, dict, start+len))
                    return true;
        }
 
        return false;
    }
}

时间是O(n ^ 2)和超过了时间限制。

  1. 动态程序
    利用动态规划方法解决这个问题的关键是:
定义一个数组t[],这样t[i]= =true => 0-(i- 1)可以使用字典进行分段
初始状态t[0]= = true
public class Solution {
    public boolean wordBreak(String s, Set<String> dict) {
        boolean[] t = new boolean[s.length()+1];
        t[0] = true; //set first to be true, why?
        //Because we need initial state
 
        for(int i=0; i<s.length(); i++){
            //should continue from match position
            if(!t[i]) 
                continue;
 
            for(String a: dict){
                int len = a.length();
                int end = i + len;
                if(end > s.length())
                    continue;
 
                if(t[end]) continue;
 
                if(s.substring(i, end).equals(a)){
                    t[end] = true;
                }
            }
        }
 
        return t[s.length()];
    }
}

时间:O(字符串长度*字典大小)。

  1. Java解决方案3 -简单高效
    在方案2中, 如果字典的数据量是非常大的, 时间是非常长的.相反,我们可以解决这个问题在O(n ^ 2)时间(n是字符串的长度).
public boolean wordBreak(String s, Set<String> wordDict) {
    int[] pos = new int[s.length()+1];
 
    Arrays.fill(pos, -1);
 
    pos[0]=0;
 
    for(int i=0; i<s.length(); i++){
        if(pos[i]!=-1){
            for(int j=i+1; j<=s.length(); j++){
                String sub = s.substring(i, j);
                if(wordDict.contains(sub)){
                    pos[j]=i;
                }
            } 
        }
    }
 
    return pos[s.length()]!=-1;
}
目录
相关文章
|
6月前
leetcode-2047:句子中的有效单词数
leetcode-2047:句子中的有效单词数
37 0
|
11月前
|
关系型数据库 Java Android开发
IELTS学习(002) - 单词(自然地理篇)
IELTS学习(002) - 单词(自然地理篇)
81 0
|
算法 C++
单词搜索:在二维网格中寻找单词的存在
单词搜索:在二维网格中寻找单词的存在
72 0
|
算法
字符矩阵内单词搜索
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
56 0
2114. 句子中的最多单词数
一个 句子 由一些 单词 以及它们之间的单个空格组成,句子的开头和结尾不会有多余空格。 给你一个字符串数组 sentences ,其中 sentences[i] 表示单个 句子 。 请你返回单个句子里 单词的最多数目 。
104 0
|
算法 前端开发
句子中的最多单词数
🎈每天进行一道算法题目练习,今天的题目是“句子中的最多单词数”,一道简单题。
231 0