leetcode【高级】单词拆分 II java

题干

给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,在字符串中增加空格来构建一个句子,使得句子中所有的单词都在词典中。返回所有这些可能的句子。

说明:

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

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

示例 2:

输入:
s = "pineapplepenapple"
wordDict = ["apple", "pen", "applepen", "pine", "pineapple"]
输出:
[
  "pine apple pen apple",
  "pineapple pen apple",
  "pine applepen apple"
]
解释: 注意你可以重复使用字典中的单词。

示例 3:

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

想法

可以暴力可以dp+dfs
这儿放上官方链接🔗传送门,我的直接看代码就能明白

Java代码

class Solution {
    //hashmap存已经求得的,提高效率
    private Map<String,List<String>> map=new HashMap<>();    
    public List<String> wordBreak(String s,List<String> wordDict){
        //res存储每一钟情况的结果
         List<String> res=new ArrayList<>();
        
        if(s.length()==0){//s为空返回空
            res.add("");
            return res; }
        if(map.containsKey(s)){//已经求过直接返回
            return map.get(s);
        }
        
        for(String word:wordDict){//遍历开始
            if(s.startsWith(word)){//如果可以的话,s的开头肯定是wordlist里的一个字符串,所以遍历的事worddict               
                List<String> tmpList=wordBreak(s.substring(word.length()),wordDict);//截取开头以后的s,进行递归
                for(String tmp:tmpList){//把已经确定有的加入res
                    res.add(word+(tmp.equals("")?"":" "+tmp));//没有就是"" 有就是加的空格 " "
                }
            }
        }
        map.put(s,res);//放入hashmap
        return res;
        
       
    }
   
    
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值