📜  门| GATE-CS-2004 |第 69 题(1)

📅  最后修改于: 2023-12-03 15:12:40.785000             🧑  作者: Mango

题目介绍

这是一道来自 GATE-CS-2004 的编程题,题号为 69,题目描述如下:

给定一个字符串 s 和一个字典 wordDict,你需要判断字符串 s 是否可以被空格分隔成一个或多个在字典中出现的单词。例如,给定字符串 s = "leetcode" 和字典 wordDict = ["leet", "code"],返回 true,因为 "leetcode" 可以被分隔成 "leet code"。

你可以假设字典中没有重复的单词。

函数签名为:

def wordBreak(s: str, wordDict: List[str]) -> bool:
    pass

请编写函数 wordBreak。

解题思路

这是一道动态规划的题目,从左到右遍历字符串 s,对于每个位置 i,分别判断以 i 结尾的子串是否在字典中出现过,并将子问题的结果合并。

具体来说,我们可以使用一个布尔型一维数组 dp 来记录以 i 结尾的子串是否能被字典中的单词拼接而成。假设 dp[j] 表示以 j 结尾的子串是否能被字典中的单词拼接而成,则 dp[i] 可以通过以下公式计算得出:

$$ dp[i] = \bigvee_{j=0}^{i-1}(dp[j] \land s[j+1..i] \in wordDict) $$

其中 $\vee$ 表示逻辑或运算符,$\land$ 表示逻辑与运算符,$a \in b$ 表示字符串 a 是否在字典 b 中出现过。

初始时,我们将 dp[0] 初始化为 True,因为空串 "" 可以被任意一个字符串拼接而成。

最终,我们将 dp[n] 的值作为答案返回,其中 n 是字符串 s 的长度。

代码实现

Python 3 代码实现如下:

from typing import List

def wordBreak(s: str, wordDict: List[str]) -> bool:
    n = len(s)
    dp = [False] * (n + 1)
    dp[0] = True
    for i in range(1, n+1):
        for j in range(i):
            if dp[j] and s[j:i] in wordDict:
                dp[i] = True
                break
    return dp[n]

总结

本题是一道经典的动态规划题目,需要熟练掌握状态转移方程。通过本题的练习,可以加深对动态规划算法的理解,并提高代码实现的能力。