From 1c2ac1587f86433b29ffb9618a35ebf9bd9eece3 Mon Sep 17 00:00:00 2001 From: robotsouper Date: Mon, 22 Jul 2024 08:51:23 -0400 Subject: [PATCH] =?UTF-8?q?Leetcode=20131(Java):=20=E7=9B=B8=E5=90=8C?= =?UTF-8?q?=E7=9A=84=E6=80=9D=E8=B7=AF=E4=BD=86=E4=B8=AA=E4=BA=BA=E8=AE=A4?= =?UTF-8?q?=E4=B8=BA=E6=9B=B4=E5=A5=BD=E7=90=86=E8=A7=A3=E7=9A=84=E5=86=99?= =?UTF-8?q?=E6=B3=95=EF=BC=8C=E9=81=B5=E5=BE=AA=E5=89=8D=E4=B8=A4=E9=A2=98?= =?UTF-8?q?=EF=BC=88combination=20sum=EF=BC=89=E7=9A=84=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=E4=BB=8E=E8=80=8C=E6=9B=B4=E5=8A=A0=E6=98=93=E6=87=82=EF=BC=8C?= =?UTF-8?q?=E5=AF=B9=E4=BA=8Ecur=E7=9A=84=E4=BD=BF=E7=94=A8=E6=94=BE?= =?UTF-8?q?=E5=BC=83deque=EF=BC=8C=E4=BF=9D=E6=8C=81=E4=BC=A0=E7=BB=9F?= =?UTF-8?q?=E4=BB=8D=E7=84=B6=E4=BD=BF=E7=94=A8arraylist?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0131.分割回文串.md | 48 +++++++++++++++----------------- 1 file changed, 22 insertions(+), 26 deletions(-) diff --git a/problems/0131.分割回文串.md b/problems/0131.分割回文串.md index 822d4399..4a868651 100644 --- a/problems/0131.分割回文串.md +++ b/problems/0131.分割回文串.md @@ -310,39 +310,35 @@ public: ### Java ```Java class Solution { - List> lists = new ArrayList<>(); - Deque deque = new LinkedList<>(); - + //保持前几题一贯的格式, initialization + List> res = new ArrayList<>(); + List cur = new ArrayList<>(); public List> partition(String s) { - backTracking(s, 0); - return lists; + backtracking(s, 0, new StringBuilder()); + return res; } - - private void backTracking(String s, int startIndex) { - //如果起始位置大于s的大小,说明找到了一组分割方案 - if (startIndex >= s.length()) { - lists.add(new ArrayList(deque)); + private void backtracking(String s, int start, StringBuilder sb){ + //因为是起始位置一个一个加的,所以结束时start一定等于s.length,因为进入backtracking时一定末尾也是回文,所以cur是满足条件的 + if (start == s.length()){ + //注意创建一个新的copy + res.add(new ArrayList<>(cur)); return; } - for (int i = startIndex; i < s.length(); i++) { - //如果是回文子串,则记录 - if (isPalindrome(s, startIndex, i)) { - String str = s.substring(startIndex, i + 1); - deque.addLast(str); - } else { - continue; + //像前两题一样从前往后搜索,如果发现回文,进入backtracking,起始位置后移一位,循环结束照例移除cur的末位 + for (int i = start; i < s.length(); i++){ + sb.append(s.charAt(i)); + if (check(sb)){ + cur.add(sb.toString()); + backtracking(s, i + 1, new StringBuilder()); + cur.remove(cur.size() -1 ); } - //起始位置后移,保证不重复 - backTracking(s, i + 1); - deque.removeLast(); } } - //判断是否是回文串 - private boolean isPalindrome(String s, int startIndex, int end) { - for (int i = startIndex, j = end; i < j; i++, j--) { - if (s.charAt(i) != s.charAt(j)) { - return false; - } + + //helper method, 检查是否是回文 + private boolean check(StringBuilder sb){ + for (int i = 0; i < sb.length()/ 2; i++){ + if (sb.charAt(i) != sb.charAt(sb.length() - 1 - i)){return false;} } return true; }