【LeetCode OJ】Word Break

Posted on 2014-04-06 10:46  卢泽尔  阅读(647)  评论(0编辑  收藏  举报

Problem link:

http://oj.leetcode.com/problems/word-break/

 

We solve this problem using Dynamic Programming method. Let A[0..n-1] be a boolean array, where A[i]=True if and only if s[i..n-1] can be segmented into words. The recursive formula is:

A[i] = True, if s[i..n-1] is a word

A[i] = True, if there exists j > i such that s[i..j-1] is a word and A[j] == True

A[i] = False, otherwise

We fill the A-table from i=n to 0, and return A[0] to tell if s[0..n-1] can be segmented into words.
(Note: there is another way that A[i] means if s[0..i] can be segmented, then the recursive formula becomes a little different, we fill the table from i=0 to n, and return A[n-1])

The pseudo-code is as follows

WORD-BREAK(string s, dictionary d):
  let A[0..n-1] be a new array of False
  for i = n-1 to 0
    if A[i..n-1] is a word in d
      A[i] = True
    else
      for j = i+1 to n-1
        if A[j] == True and s[i..j-1] is a word in d
            A[i] = True
            break
  return A[0]

And the following code is the python solution accepted by OJ.leetcode.

class Solution:
    # @param s, a string
    # @param dict, a set of string
    # @return a boolean
    def wordBreak(self, s, dict):
        """
        We solve this problem using DP
        Define a boolean array A[0..n-1], where
        A[i] = True, means s[i..n-1] can be segmented into words
        ------------------------------------
        The recursive formula is:
        A[i] = True, if there exists j>i (s[i..n-1] = s[i..j-1] + s[j..n-1])
                   such that s[i..j-1] is a word and A[j] = True
        or A[i] = True, if A[i..n-1] is a word
        ------------------------------------
        We fill A-table from i=n-1 to n
        """
        n = len(s)
        A = [False] * n
        i = n-1
        while i >= 0:
            if s[i:n] in dict:
                A[i] = True
            else:
                for j in xrange(i+1, n):
                    if A[j] and s[i:j] in dict:
                        A[i] = True
                        break
            i -= 1
        return A[0]