Leetcode:给定一个字符串s和一个单词字典dict,确定是否可以将s分割成一个由一个或多个字典单词组成的空格分隔的序列。

Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separated sequence of one or more dictionary words.

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

Return true because"leetcode"can be segmented as"leet code".

思路:动态规划法

设置一个boolean数组dp,dp[k]代表字符串s前k个字符组成的字符串是否能够被分割成字典dict中的序列,dp[i]等于true时表示能够被分割。

如题中所给例子s ="leetcode",   dict =["leet", "code"].

初始dp[0] = true.

       i 1        2       3       4      5      6       7         8
   
   j 0   l       le      lee    leet   leetc   leetco   leetcod  leetcode
     
     1            e       ee     eet    eetc    eetco   eetcod    eetcode
     
     2                    e      et     etc      etco   etcod     etcode
 
     3                            t      tc       tco    tcod      tcode
   
     4                                    c        co     cod       code

     5                                              o      od        ode

     6                                                      d        de
 
     7                                                               e                                         
 

(1)当i = 4, j = 0时,s.substring(i,j)="leet","leet"在字典dict中可以找得到,可以被分割,而且d[j] = true,代表前j个字符的字符串可以被分割(前一子问题的解为后一子问题的求解提供了有用的信息),因此前i个字符的字符串“leet”可以被分割,因此d[i] = true。

(2)当i = 8,j = 4时,s.substring(i,j)="code","code"在字典dict中可以找得到,可以被分割,而且d[j] = true,代表前j个字符的字符串可以被分割(前一子问题的解为后一子问题的求解提供了有用的信息,从第一步可知字符串s前4个字符组成的字符串"leet"可以被分割),因此前i个字符的字符串"leetcode"可以被分割,因此d[i] = true。

(3)最后返回dp[len],代表前len个字符所组成的字符串是否能够被分割成字典dict中的序列,即整个字符串是否可以被分割。

Java代码实现

import java.util.Set;

public class Solution {
    public boolean wordBreak(String s, Set dict) {
        int len = s.length();
       //默认值均为false
        boolean[] dp = new boolean[len + 1];
        dp[0] = true;
        for(int i = 1; i <= len; i++){
            for(int j = 0; j < i; j++){
                if(dp[j] && dict.contains(s.substring(j,i))){
                    dp[i] = true;
                    break;
                }
            }
        }
        return dp[len];
    }
}

 

 

你可能感兴趣的:(Leetcode:给定一个字符串s和一个单词字典dict,确定是否可以将s分割成一个由一个或多个字典单词组成的空格分隔的序列。)