每天一道算法题-动态规划 单词分隔

本文深入探讨了如何利用字典中的单词判断一个给定的字符串是否能被拆分为字典中存在的单词序列。通过动态规划的方法,文章详细解释了一个高效的算法实现,并提供了具体的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。

说明:

拆分时可以重复使用字典中的单词。
你可以假设字典中没有重复的单词。
示例 1:

输入: s = "leetcode", wordDict = ["leet", "code"]
输出: true
解释: 返回 true 因为 "leetcode" 可以被拆分成 "leet code"。
示例 2:

输入: s = "applepenapple", wordDict = ["apple", "pen"]
输出: true
解释: 返回 true 因为 "applepenapple" 可以被拆分成 "apple pen apple"。
     注意你可以重复使用字典中的单词。
示例 3:

输入: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"]
输出: false

 

package com.ep.rabbitmq.test;

import org.springframework.util.StringUtils;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

class Solution {
    public static boolean  wordBreak(String s, List<String> wordDict) {
        boolean dict=false;
        boolean[] flag = new boolean[s.length() + 1];
        //如果为空字符串则为true
        flag[0] = true;
        String temp;
        /**
         * 1.首先从前往后遍历求出满足s字符串分隔下来的字符串属于字典,将对应的辅助数组对应的变量设置为 
         * true,表示如果s字符串只有对应的长度,则表示满足字典要求。
         * 2.然后通过循环查找,满足辅助数组flag[i]为true,则遍历begin=i,end=length的字符串,如果满足字典要求,
         * 则表示对应长度的字符串满足字典要求。
         * 注意:如果遍历的wordDict.contains(temp)条件不满足,则不能设置该点flag为false,因为ture表示的为动态规划
         * 求得的已知s满足字典要求的情况。
         * */
        for (int i=0;i<s.length();i++){
            //如果字符串中该组合满足条件
            for (boolean b : flag) {
                System.out.print(b+"  ");
            }
            System.out.println();
            if(flag[i]) {
                for (int k = i; k <s.length(); k++) {
                    //切割字符串
                    temp = s.substring(i, k+1);
                    if (wordDict.contains(temp)&& !flag[k+1]) {
                        flag[k+1] = true;
                    }
                }
            }
        }

        return flag[s.length()];
    }

    public static void main(String[] args) {
      String  s = "abcd";
      List <String>wordDict = new ArrayList<>();
      wordDict.add("a");
      wordDict.add("b");
      wordDict.add("abc");
      wordDict.add("cd");


      System.out.println("结果"+wordBreak(s,wordDict));
    }
}

 

 

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/word-break
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值