zoukankan      html  css  js  c++  java
  • Word Break

    Word Break

    问题:

    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".

    思路:

      DFS是最朴素的方法

      更加高端的方法是动态规划

    我的代码:

    public class Solution {
        public boolean wordBreak(String s, Set<String> dict) {
            if(s == null || s.length() == 0)    return true;
            int n = s.length();
            boolean [][] flag = new boolean[n][n];
            for(int size = 1; size <= n; size++)
            {
                for(int k = 0; k <= n - size; k++)
                {
                    if(dict.contains(s.substring(k, k + size)))
                    {
                        flag[k][k+size-1] = true;
                    }
                    else
                    {
                        for(int j = k; j < k + size - 1; j++)
                        {
                            flag[k][k+size-1] |= (flag[k][j] & flag[j+1][k+size-1]);
                        }
                    }
                }
            }
            return flag[0][n-1];
            
        }
    }
    View Code

    他人代码:

    public class Solution {
        public boolean wordBreak(String s, Set<String> dict) {
            boolean [] breakable = new boolean[s.length()+1];
            breakable[0] = true;
    
            for(int i=1;i<=s.length();i++){
                for(int j=0;j<i;j++){
                    if(breakable[j]&&dict.contains(s.substring(j,i))){
                        breakable[i] = true;
                        break;
                    }
                }
            }
            return breakable[s.length()];
        }
    }
    View Code

    学习之处:

    • 对于string的切分问题,DFS肯定是可以解决的,时间复杂度过高,所以我们要想到的是否可以用动态规划解决
    • 常用的一个模板
            for(int size = 1; size <= n; size++)
            {
                for(int k = 0; k <= n - size; k++)
                {
                    for(int i = k; i < k + size; i++)
                    {
                    }
                }
            }
    View Code
    • 这个动态规划问题,好好想想就想出来了,我是用的二维数组进行存储的,动态规划方程如下图所示,别人用一维数组也解决了,更加简练一些,最外层的循环只是string 的size 从1 --> n这也是常用的外在添加的循环。
    • 动态规划的思想是大问题由所有的小问题情况的集合组成的。大问题== 所有小问题

  • 相关阅读:
    Python进阶-----类、对象的相关知识
    Python进阶-----面向对象和类的基本定义
    Python基础-----hashlib模块
    Python基础-----configparser模块
    Python基础-----logging模块
    Python基础-----re模块(模糊匹配)
    Python基础-----xml模块
    Python基础-----shelve模块
    Python基础-----pickle模块
    Python基础-----json模块
  • 原文地址:https://www.cnblogs.com/sunshisonghit/p/4350503.html
Copyright © 2011-2022 走看看