LeetCode--139. Word Break

小编 2026-06-19 阅读:525 评论:0
题目链接:https://leetcode.com/problems/word-break/ 要求给字符串进行切分(break)是的得到的单词都在字典中。 思路一:首先想到的暴力解法:在每个可能的位置将...

题目链接:https://leetcode.com/problems/word-break/

要求给字符串进行切分(break)是的得到的单词都在字典中。

思路一:首先想到的暴力解法:在每个可能的位置将字符串切分为两部分,然后检查这两部分是否都存在于字符串中,如果某部分字符串不存在,则将此字符串继续进行切分,直到存在或者长度为1为止,这是个极其暴力的算法,存在大量重复操作,代码如下:

class Solution {
    
    public static HashSet<String> hs;
    
    public boolean wordBreak(String s, List<String> wordDict) {
        
        hs=new HashSet<String>();
        Iterator<String> iter=wordDict.iterator();
        while(iter.hasNext())
            hs.add(iter.next());
        return recursive(s);
        
    }
    
    public static boolean recursive(String s)
    {
        if(hs.contains(s))
            return true;
        String s1=null;
        String s2=null;
        boolean isbreak=false;
        for(int i=0;i<=s.length()-2;i++)
        {
            s1=s.substring(0,i+1);
            s2=s.substring(i+1,s.length());
            isbreak =isbreak || (recursive(s1) && recursive(s2));
        }
        return isbreak;
    }
}

算法复杂度高达O(2^n),自然会想到用动态规划来讲中间结果缓存下来,于是想到用二维数组来保存枚举的子字符串的

然后又想了一个稍微简化的解法:

图示如下:

 

0

1

2

3

4

5

6

7

8

9

10

11

12

0

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

 

 

 

 

 

 

 

 

 

 

 

 

2

 

 

 

 

 

 

 

 

 

 

 

 

 

3

 

 

 

 

 

 

 

 

 

 

 

 

 

4

 

 

 

 

 

 

 

 

 

 

 

 

 

5

 

 

 

 

 

 

 

 

 

 

 

 

 

6

 

 

 

 

 

 

 

 

 

 

 

 

 

7

 

 

 

 

 

 

 

 

 

 

 

 

 

8

 

 

 

 

 

 

 

 

 

 

 

 

 

9

 

 

 

 

 

 

 

 

 

 

 

 

 

10

 

 

 

 

 

 

 

 

 

 

 

 

 

11

 

 

 

 

 

 

 

 

 

 

 

 

 

12

 

 

 

 

 

 

 

 

 

 

 

 

 

class Solution {
    
    public static HashSet<String> hs;
    
    public static boolean[][] memo;

    public static int n;
    
    public static boolean flag;
    
    public boolean wordBreak(String s, List<String> wordDict) {
        
        flag=false;
        n=s.length();
        memo=new boolean[n][n];
        Iterator<String> iter=wordDict.iterator();
        hs=new HashSet<>();
        while(iter.hasNext())
            hs.add(iter.next());
        for(int i=0;i<s.length();i++)
        {
            for(int j=i;j<s.length();j++)
            {
                String st=s.substring(i,j+1);
                if(hs.contains(st))
                    memo[i][j]=true;
            }
        }
        recursive(0);

        return memo[0][n-1];
    }
    
    public static void recursive(int j)
    {
        if(j>=n)
        {
            return;
        }
        for(int i=j;i<n;i++)
        {
            if(!flag && memo[j][i])
            {
                memo[0][i]=true;
                if(i==n-1)
                    flag=true;
                recursive(i+1);
            }
        }
    }
}

这个解法也TLE了,我根据TLE的测试用例发现还是枚举子字符串这一步太消耗时间了,并且遇到连续相同的字母组成的字符串时,递归那一步时间复杂度也较高,因为我将子字符串作为动态规划的单元记录下来,然后通过相邻关系拼接进行动态规划,所以可以考虑将目标字符串的前缀串是否可以break在字典中作为动态规划的单元。代码如下:

class Solution {

    
   public boolean wordBreak(String s, List<String> wordList)
   {
       if (s == null || s.length() == 0) 
           return false;
       int n = s.length();
       Set<String> set = new HashSet<>();
       for (String word : wordList) 
           set.add(word);
 
       boolean[] dp = new boolean[n];
       for (int i = 0; i < n; i++) 
       {
           for (int j = 0; j <= i; j++) 
           {
               String sub = s.substring(j, i + 1);
               if (set.contains(sub) && (j == 0 || dp[j - 1]))
               {
                   dp[i] = true;
                   break;
               }
           }
       }
       return dp[n - 1];
   }
}

这条题目解的过程真艰辛,不过动态规划一般是基于暴力递归搜索来优化的。

版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
标签列表