Given a string s, partition s such that every substring of the partition is a palindrome.
Return the minimum cuts needed for a palindrome partitioning of s.
Example:
Input: "aab" Output: 1 Explanation: The palindrome partitioning ["aa","b"] could be produced using 1 cut.求最短路径, 可以使用BFS来做 每一层级,找到孩子,加到queue里。
class Solution { public int minCut(String s) { int n = s.length(); int result = 0; Queue<Integer> queue = new LinkedList<>(); queue.add(0); while (!queue.isEmpty()) { int size = queue.size(); for (int i = 0; i < size; i++) { int start = queue.poll(); if (start == n) { return result - 1; } for (int j = start; j < n; j++) { if (isPal(s, start, j)) { queue.add(j + 1); } } } result++; } return result; } private boolean isPal(String s, int start, int end) { while (start <= end) { if (s.charAt(start) != s.charAt(end)) { return false; } start++; end--; } return true; } }问题: 会超时。因为有重复计算。相同的start会重复加入queue。 可以使用一个set,来判断是否加过这个start。
class Solution { public int minCut(String s) { int n = s.length(); int result = 0; Queue<Integer> queue = new LinkedList<>(); // 加入set,来判断是否重复加入了孩子 Set<Integer> set = new HashSet<>(); queue.add(0); while (!queue.isEmpty()) { int size = queue.size(); for (int i = 0; i < size; i++) { int start = queue.poll(); if (start == n) { return result - 1; } for (int j = start; j < n; j++) { if (!set.contains(j + 1) && isPal(s, start, j)) { queue.add(j + 1); set.add(j + 1); } } } result++; } return result; } private boolean isPal(String s, int start, int end) { while (start <= end) { if (s.charAt(start) != s.charAt(end)) { return false; } start++; end--; } return true; } }