| 
1 | 1 | package com.blankj.hard._044;  | 
2 | 2 | 
 
  | 
 | 3 | +import java.util.ArrayList;  | 
 | 4 | +import java.util.Collections;  | 
 | 5 | +import java.util.List;  | 
 | 6 | + | 
3 | 7 | /**  | 
4 | 8 |  * <pre>  | 
5 | 9 |  * author: Blankj  | 
@@ -30,35 +34,74 @@ public class Solution {  | 
30 | 34 | // return pi == pl;  | 
31 | 35 | // }  | 
32 | 36 | 
 
  | 
33 |  | - public boolean isMatch(String s, String p) {  | 
34 |  | - if (p.length() == 0) return s.length() == 0;  | 
35 |  | - int sl = s.length(), pl = p.length();  | 
36 |  | - boolean[][] dp = new boolean[sl + 1][pl + 1];  | 
37 |  | - char[] sc = s.toCharArray(), pc = p.toCharArray();  | 
38 |  | - dp[0][0] = true;  | 
39 |  | - for (int i = 1; i <= pl; ++i) {  | 
40 |  | - if (pc[i - 1] == '*') dp[0][i] = dp[0][i - 1];  | 
 | 37 | +// public boolean isMatch(String s, String p) {  | 
 | 38 | +// if (p.length() == 0) return s.length() == 0;  | 
 | 39 | +// int sl = s.length(), pl = p.length();  | 
 | 40 | +// boolean[][] dp = new boolean[sl + 1][pl + 1];  | 
 | 41 | +// char[] sc = s.toCharArray(), pc = p.toCharArray();  | 
 | 42 | +// dp[0][0] = true;  | 
 | 43 | +// for (int i = 1; i <= pl; ++i) {  | 
 | 44 | +// if (pc[i - 1] == '*') dp[0][i] = dp[0][i - 1];  | 
 | 45 | +// }  | 
 | 46 | +// for (int i = 1; i <= sl; ++i) {  | 
 | 47 | +// for (int j = 1; j <= pl; ++j) {  | 
 | 48 | +// if (pc[j - 1] != '*') {  | 
 | 49 | +// dp[i][j] = dp[i - 1][j - 1] && (sc[i - 1] == pc[j - 1] || pc[j - 1] == '?');  | 
 | 50 | +// } else {  | 
 | 51 | +// dp[i][j] = dp[i][j - 1] || dp[i - 1][j];  | 
 | 52 | +// }  | 
 | 53 | +// }  | 
 | 54 | +// }  | 
 | 55 | +// return dp[sl][pl];  | 
 | 56 | +// }  | 
 | 57 | + | 
 | 58 | + public List<String> fullJustify(String[] words, int maxWidth) {  | 
 | 59 | + int len = words.length;  | 
 | 60 | + if (len == 0) return Collections.emptyList();  | 
 | 61 | + List<String> ans = new ArrayList<>();  | 
 | 62 | + StringBuilder spaces = new StringBuilder();  | 
 | 63 | + for (int i = 0; i < maxWidth; ++i) {  | 
 | 64 | + spaces.append(" ");  | 
41 | 65 |  }  | 
42 |  | - for (int i = 1; i <= sl; ++i) {  | 
43 |  | - for (int j = 1; j <= pl; ++j) {  | 
44 |  | - if (pc[j - 1] != '*') {  | 
45 |  | - dp[i][j] = dp[i - 1][j - 1] && (sc[i - 1] == pc[j - 1] || pc[j - 1] == '?');  | 
 | 66 | + int sLen = -1, left = 0;  | 
 | 67 | + for (int i = 0; i < len; ++i) {  | 
 | 68 | + if (sLen + words[i].length() + 1 <= maxWidth) {  | 
 | 69 | + sLen += words[i].length() + 1;  | 
 | 70 | + } else {  | 
 | 71 | + StringBuilder sub = new StringBuilder(words[left]);  | 
 | 72 | + int rest = maxWidth - sLen;  | 
 | 73 | + int seg = i - left;  | 
 | 74 | + if (seg == 0) {  | 
 | 75 | + sub.append(spaces.substring(0, rest));  | 
46 | 76 |  } else {  | 
47 |  | - dp[i][j] = dp[i][j - 1] || dp[i - 1][j];  | 
 | 77 | + int leastSpace = rest / seg + 1;  | 
 | 78 | + int restSpace = rest % seg;  | 
 | 79 | + for (int j = left + 1; j < i; ++j) {  | 
 | 80 | + if (restSpace-- > 0) {  | 
 | 81 | + sub.append(spaces.substring(0, leastSpace + 1)).append(words[j]);  | 
 | 82 | + } else {  | 
 | 83 | + sub.append(spaces.substring(0, leastSpace)).append(words[j]);  | 
 | 84 | + }  | 
 | 85 | + }  | 
48 | 86 |  }  | 
 | 87 | + ans.add(sub.toString());  | 
 | 88 | + left = i;  | 
 | 89 | + sLen = words[i].length();  | 
49 | 90 |  }  | 
50 | 91 |  }  | 
51 |  | - return dp[sl][pl];  | 
 | 92 | + StringBuilder sub = new StringBuilder(words[left]);  | 
 | 93 | + for (int i = left + 1; i < len; ++i) {  | 
 | 94 | + sub.append(" ").append(words[i]);  | 
 | 95 | + }  | 
 | 96 | + ans.add(sub + spaces.substring(0, maxWidth - sub.length()));  | 
 | 97 | + return ans;  | 
52 | 98 |  }  | 
53 | 99 | 
 
  | 
 | 100 | + | 
54 | 101 |  public static void main(String[] args) {  | 
55 | 102 |  Solution solution = new Solution();  | 
56 |  | - System.out.println(solution.isMatch("aa", "a")); // false  | 
57 |  | - System.out.println(solution.isMatch("aa", "aa")); // true  | 
58 |  | - System.out.println(solution.isMatch("aaa", "aa")); // false  | 
59 |  | - System.out.println(solution.isMatch("aa", "*")); // true  | 
60 |  | - System.out.println(solution.isMatch("aa", "a*")); // true  | 
61 |  | - System.out.println(solution.isMatch("ab", "?*")); // true  | 
62 |  | - System.out.println(solution.isMatch("aab", "c*a*b"));// false  | 
 | 103 | + System.out.println(solution.fullJustify(new String[]{"", ""}, 0));  | 
 | 104 | + System.out.println(solution.fullJustify(new String[]{"a"}, 1));  | 
 | 105 | + System.out.println(solution.fullJustify(new String[]{"This", "is", "an", "example", "of", "text", "justification."}, 16));  | 
63 | 106 |  }  | 
64 | 107 | }  | 
0 commit comments