132. Palindrome Partitioning II

mac2024-02-19  36

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; } }
最新回复(0)