Word Break 单词分解

Word Break 单词分解

题意:这道题的思路和前面一道也是字符串的切分的题目的思路是一样的,这里是判断当前的字符串是否是字典中给定的字符串来组成。

回溯

回溯方法,可以用idx,也可以用当前子串的形式。

class Solution(object):
    def wordBreak(self, s, wordDict):
        """
        :type s: str
        :type wordDict: List[str]
        :rtype: bool
        """
        def backtracking(idx):
            if idx >= len(s):
                return True
            for w in wordDict:
                if idx + len(w) <= len(s) and s[idx:idx+len(w)] == w and backtracking(idx + len(w)):
                    return True
            return False
        return backtracking(0)
class Solution(object):
    def wordBreak(self, s, wordDict):
        """
        :type s: str
        :type wordDict: List[str]
        :rtype: bool
        """
        def backtracking(cur):
            if cur == s:
                return True
            for w in wordDict:
                if len(cur) + len(w) <= len(s) and s.find(cur + w) != -1 and backtracking(cur + w):
                    return True
            return False
        return backtracking('')

动态规划

思路:动态规划的思想,需要两层循环,循环可以从前往后扫,那么获取的则是最后的值,因为它需要获取前面的值,从而对后面的值进行影响;反之,也可以从后往前扫,那么获取的是则是起始的值。(假定从前往后面扫)则可以假定dp[i]表示i之前的元素是否出现在字典中,如果出现则设置为True,第一层循环选择切分的位置,第二层循环进行移动,比如,LeetCode,最外层循环到下标移动到C的时候,因为子串[0:4)存在于字典中,则设置dp[4]为True,然后最外层循环继续移动到了最后时,发现dp[4]为True,说明下标4之前的子串出现在字典中,同时从[4:8)也存在于字典中,则设置dp[8]为True,最后获取dp数组最后一个元素的值即可。

class Solution(object):
    def wordBreak(self, s, wordDict):
        """
        :type s: str
        :type wordDict: List[str]
        :rtype: bool
        """
        dp = [True] + [False] * len(s)
        for i in range(1, len(s)+1):
            for j in range(i):
                if dp[j] and s[j:i] in wordDict:
                    dp[i] = True
                    break
        return dp[len(s)]

也可以从后往前扫,同样的思路。

class Solution(object):
    def wordBreak(self, s, wordDict):
        """
        :type s: str
        :type wordDict: List[str]
        :rtype: bool
        """
        dp = [False] * len(s) + [True]
        for i in range(len(s), -1, -1):
            for j in range(i, len(s)+1):
                if dp[j] and s[i:j] in wordDict:
                    dp[i] = True
                    break
        return dp[0]
posted @ 2017-09-23 15:24  banananana  阅读(229)  评论(0)    收藏  举报