zoukankan      html  css  js  c++  java
  • Word Break II

     1 public class Solution {
     2     public ArrayList<String> wordBreak(String s, Set<String> dict) {
     3         // IMPORTANT: Please reset any member data you declared, as
     4         // the same Solution instance will be reused for each test case.
     5         ArrayList<String> result = new ArrayList<String>();
     6         if (s == null || dict.size() <= 0) {
     7             return result;
     8         }
     9         int length = s.length();
    10         // seg(i, j) means substring t start from i and length is j can be
    11         // segmented into
    12         // dictionary words
    13         boolean[][] seg = new boolean[length][length + 1];
    14         for (int len = 1; len <= length; len++) {
    15             for (int i = 0; i < length - len + 1; i++) {
    16                 String t = s.substring(i, i + len);
    17                 if (dict.contains(t)) {
    18                     seg[i][len] = true;
    19                     continue;
    20                 }
    21                 for (int k = 1; k < len; k++) {
    22                     if (seg[i][k] && seg[i + k][len - k]) {
    23                         seg[i][len] = true;
    24                         break;
    25                     }
    26                 }
    27             }
    28         }
    29         if (!seg[0][length]) {
    30             return result;
    31         }
    32 
    33         int depth = 0;
    34         dfs(s, seg, 0, length, depth, result, new StringBuffer(), dict);
    35 
    36         return result;
    37     }
    38 
    39     private static void dfs(String s, boolean[][] seg, int start, int length,
    40             int depth, ArrayList<String> result, StringBuffer sb, Set<String> dict) {
    41         if (depth == length) {
    42             String t = sb.toString();
    43             result.add(t.substring(0, t.length() - 1));
    44             return;
    45         }
    46 
    47         for (int len = 1; len <= length; len++) {
    48             if (seg[start][len]) {
    49                 String t = s.substring(start, start + len);
    50                 if(!dict.contains(t)){
    51                     continue;
    52                 }
    53                 int beforeAddLen = sb.length();
    54                 sb.append(t).append(" ");
    55                 dfs(s, seg, start + len, length, start + len, result, sb, dict);
    56                 sb.delete(beforeAddLen, sb.length());
    57             }
    58         }
    59     }
    60 }
  • 相关阅读:
    C++对象模型
    GUID 转 char *
    MFC中App,Doc,MainFrame,View各指针的互相获取
    MFC中设置某个VIEW为当前视图
    MFC中如何在CMainFrame类中访问CxxxView视图类中的成员
    GetMessage 和 PeekMessage 区别
    STL 常用容器
    收发ICMP封包,实现ping
    软件弹窗广告
    python 输入一个字符串,打印出它所有的组合
  • 原文地址:https://www.cnblogs.com/jasonC/p/3436758.html
Copyright © 2011-2022 走看看