1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
| import java.util.ArrayList; import java.util.List;
public class _131分割回文串 {
int[][] f; List<List<String>> ret = new ArrayList<List<String>>(); List<String> ans = new ArrayList<String>(); int n;
public List<List<String>> partition_gov(String s) { n = s.length(); f = new int[n][n];
dfs(s, 0); return ret; }
public void dfs(String s, int i) { if (i == n) { ret.add(new ArrayList<String>(ans)); return; } for (int j = i; j < n; ++j) { if (isPalindrome(s, i, j) == 1) { ans.add(s.substring(i, j + 1)); dfs(s, j + 1); ans.remove(ans.size() - 1); } } }
public int isPalindrome(String s, int i, int j) { if (f[i][j] != 0) { return f[i][j]; } if (i >= j) { f[i][j] = 1; } else if (s.charAt(i) == s.charAt(j)) { f[i][j] = isPalindrome(s, i + 1, j - 1); } else { f[i][j] = -1; } return f[i][j]; }
public List<List<String>> partition_dp(String s) { List<List<String>> res = new ArrayList<>(); char[] charArray = s.toCharArray(); boolean[][] dp = new boolean[s.length()][s.length()]; for (int i = 1; i < s.length(); i++) { dp[i][i] = true; dp[i - 1][i] = charArray[i] == charArray[i - 1]; } dp[0][0] = true;
for (int j = 2; j < charArray.length; j++) { for (int i = 0; i < j - 1; i++) { dp[i][j] = charArray[i] == charArray[j] && dp[i + 1][j - 1]; } }
List<String> childRes = new ArrayList<>(); divide(res, childRes, dp, s, 0); return res; }
private void divide(List<List<String>> res, List<String> childPre, boolean[][] dp, String s, int start) { if (start == s.length()) { res.add(childPre); return; } for (int i = start; i < s.length(); i++) { if (dp[start][i]) { List<String> childNew = new ArrayList<>(childPre); childNew.add(s.substring(start, i + 1)); divide(res, childNew, dp, s, i + 1); } } }
public static void main(String[] args) { _131分割回文串 solution = new _131分割回文串();
System.out.println(solution.partition_dp("aabaad")); } }
|