LeetCode-131-分割回文串
阿新 • • 發佈:2021-11-28
分割回文串
題目描述:給你一個字串
s
,請你將s
分割成一些子串,使每個子串都是 迴文串 。返回s
所有可能的分割方案。迴文串 是正著讀和反著讀都一樣的字串。
示例說明請見LeetCode官網。
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/palindrome-partitioning/
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
解法一:遞迴法
首先處理兩種特殊情況,如果字串為null,直接返回空結果集;如果字串的長度為1,則只有一種分割情況,直接返回這種情況。
當字串的長度大於1時,使用遞迴的方式處理,其中會使用一個判斷字串是否是迴文串的方法isHuiwen,遞迴過程如下:
- 從字串的第一個字元開始判斷,引數有前面已經被分割槽的迴文串list、當前位置、當前要判斷的子串;
- 首先判斷如果已經處理到字串的最後一個字元,如果當前分割槽字串是迴文串,則將當前分割槽字串新增到partitions,然後將之新增到結果集中,否則,直接返回;
- 否則,首先判斷當前分割槽字串是否是迴文串,有兩種可能:
- 如果是,則將當前分割槽字串新增到partitions,將下一個字元作為新的分割槽字串開始遞迴判斷;
- 如果不是,將下一個字元新增到當前分割槽字串中,遞迴判斷。
最後,返回結果集。
import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; public class LeetCode_131 { // 結果集 private static List<List<String>> result = new ArrayList<>(); public static List<List<String>> partition(String s) { // 如果字串為null,直接返回空結果集 if (s == null) { return new ArrayList<>(); } // 如果字串只有一個字元,只可能有一個結果,直接返回 if (s.length() == 1) { List<String> partition = new ArrayList<>(); partition.add(s); result.add(partition); return result; } partition(s, 0, new ArrayList<>(), s.substring(0, 1)); return result; } /** * 遞迴方法 * * @param s 原始字串 * @param pos 當前位置 * @param partitions 當前位置之前已經被分割的迴文串 * @param curPartition 當前分割槽字串 */ private static void partition(String s, int pos, List<String> partitions, String curPartition) { // 已經處理到字串的最後一個字元 if (pos == s.length() - 1) { if (isHuiwen(curPartition)) { // 如果當前分割槽字串是迴文串,則將當前分割槽字串新增到partitions,然後將之新增到結果集中 List<String> newPartitions = new ArrayList<>(Arrays.asList(new String[partitions.size()])); Collections.copy(newPartitions, partitions); newPartitions.add(curPartition); result.add(newPartitions); } return; } // 如果當前分割槽字串是迴文串,則將當前分割槽字串新增到partitions,然後遞迴判斷下一個字元 if (isHuiwen(curPartition)) { List<String> newPartitions = new ArrayList<>(Arrays.asList(new String[partitions.size()])); Collections.copy(newPartitions, partitions); newPartitions.add(curPartition); partition(s, pos + 1, newPartitions, s.substring(pos + 1, pos + 2)); } // 遞迴處理下一個字串 partition(s, pos + 1, partitions, curPartition + s.substring(pos + 1, pos + 2)); } /** * 判斷字串是否是迴文串 * * @param str 字串 * @return */ private static boolean isHuiwen(String str) { if (str == null || str.length() < 2) { return true; } for (int i = 0; i < str.length() / 2; i++) { if (str.charAt(i) != str.charAt(str.length() - 1 - i)) { return false; } } return true; } public static void main(String[] args) { for (List<String> string : partition("aab")) { System.out.println(string); } } }
【每日寄語】 棄燕雀之小志,慕鴻鵠而高翔。