Skip to content

单词拆分 #172

Open
Open
@TieMuZhen

Description

@TieMuZhen

image

法一:动态规划

/**
 * @param {string} s
 * @param {string[]} wordDict
 * @return {boolean}
 */
// 我们定义dp[i] 表示字符串 s 前 i 个字符组成的字符串 s[0..i−1] 是否能被空格拆分成若干个字典中出现的单词
// 转移方程:dp[i]=dp[j] && check(s[j..i−1])

var wordBreak = function(s, wordDict) {
    const len = s.length;
    const dp = new Array(len + 1).fill(false);
    const wordSet = new Set(wordDict);
    dp[0] = true; // 长度为 0 的s能拆分成单词表单词。

    for(let i = 1; i <= len; i++){
        for(let j = 0; j < i; j++){
            // slice [)  substr []
            const word = s.substr(j, i - j);
            if(wordSet.has(word) && dp[j]){
                dp[i] = true;
                break; // i长度的子串已经可以拆成单词了,不需要j继续划分子串了
            }
        }
    }
    return dp[len];
};

法二:DFS(会超时)

/**
 * @param {string} s
 * @param {string[]} wordDict
 * @return {boolean}
 */
function backtracking(s, wordSet, index){
    if(index == s.length) return true;

    for(let i = index; i <= s.length; i++){
        let word = s.slice(index, i);
        if(wordSet.has(word) && backtracking(s, wordSet, i)){
            return true
        }
    }
    return false;
}
var wordBreak = function(s, wordDict) {
    const wordSet = new Set(wordDict);
    return backtracking(s, wordSet, 0);
};

image

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions