WordBreak

1.问题描述

给定一个字符串s,以及无重复元素的词典dict,找出所有由dict单词组合形成的所有s表示,其中组成同一个s的所有单词之间用空格分割

2.解题思路

动态规划:

1)假设存在全局的map,其key保存用于分割的 字符串s,其value保存所有可能的单词组合

2)如果s在map中,则直接返回其value值

3)如果s不在map中,若s刚好为dict中的一个单词,则将s加入value中;否则认为0~i之间的子串的所有组合为wordBreak(s.substring(0, i),dict),最后一个子串为s.substring(i)

4)如果最后一个子串刚好在dict中,则需要遍历wordBreak(s.substring(0, i),dict)中的所有组合,并将最后一个子串加入到每个组合后面,用“ ”分割

5)map.put(s,ret) //ret为构成s的所有组合

6) return ret;

3.程序源码
import java.util.*;
public class Solution {
    
     Map<String, ArrayList<String>> map = new HashMap<>();
     public ArrayList<String> wordBreak(String s, Set<String> dict) {
         if(map.containsKey(s))
             return map.get(s);
         int len = s.length();
         ArrayList<String> ret = new ArrayList<>();
         if(dict.contains(s))
             ret.add(s);
         for(int i=1; i<len; i++){
             String curr = s.substring(i);
             if(dict.contains(curr)){
                 List<String> strs = wordBreak(s.substring(0, i),dict);
                 if(strs.size() > 0){
                     for(String str : strs){
                         ret.add(str + " " + curr);
                     }
                 }
             }
         }
         map.put(s, ret);
         return ret;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值