leetcode 131. Palindrome Partitioning-回溯算法

来源:互联网 发布:大数据的4v特征是 编辑:程序博客网 时间:2024/06/01 21:36
原题链接:131. Palindrome Partitioning

【思路-Java】递归实现

本题采用回溯算法实现。回溯算法循环和递归相互嵌套,关键是要理清循环中何时递归,何时不进行递归。

我们在最外层循环中判断字符串 s 中的[i,j]是否构成回文。如果构成回文,那么,接着判断s 中 j+1及以后的字符是否构成回文;如果不构成回文,那么就不进行下一次递归,直接在本层循环中判断[i,j+1]是否构成回文:

public class Solution {    public List<List<String>> partition(String s) {        List<List<String>> res = new ArrayList<>();        dfs(s, res, new ArrayList<String>(), 0);        return res;    }    private void dfs(String s, List<List<String>> res, List<String> temp, int i) {        if(i == s.length()) {            res.add(new ArrayList<>(temp));            return;        }        for(int j = i; j < s.length(); j++) {            if(isPalindrome(s, i, j)) {  //如果[i,j]中字符不构成回文,那么不进行下一次递归,直接进入下一次循环判断[i,j+1]                temp.add(s.substring(i,j+1));                dfs(s, res, temp, j+1);  //如果[i,j]中字符构成回文,那么进行下一次递归,判断j+1之后字符是否构成回文                temp.remove(temp.size()-1);            }        }    }    private boolean isPalindrome(String s, int start, int end) {  //判断s中[start,end]字符是否构成回文        while(start < end)            if(s.charAt(start++) != s.charAt(end--)) return false;        return true;    }}
22 / 22 test cases passed. Runtime: 6 ms  Your runtime beats 67.43% of javasubmissions.

1 0