分割回文串

题目描述

给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。回文串 是正着读和反着读都一样的字符串。

分割回文串_第1张图片

思路

从 s 的头部开始暴力穷举,如果发现 s[0…i] 是一个回文子串,那么我们就可以把 s 切分为 s[0…i] 和 s[i+1…], 然后我们去尝试把 s[i+1…] 去暴力切分成多个回文子串即可。

代码如下

public class SplitPalindromeString {

    List<List<String>> res = new ArrayList<>();
    LinkedList<String> list = new LinkedList<>();

    public List<List<String>> partition(String s) {
        dfs(s, 0);
        return res;

    }

    public void dfs(String s, int start){
        // 结束条件
        if(start == s.length()){
            res.add(new ArrayList<>(list));
            return;
        }
        for(int i = start;i < s.length();i++){
            if(isValid(s, start, i)){
                list.add(s.substring(start, i + 1));
            }else{
                continue;
            }
            dfs(s, i + 1);
            list.removeLast();
        }
    }

    public boolean isValid(String s, int start, int end){
        while(start < end && s.charAt(start) == s.charAt(end)){
            start++;
            end--;
        }
        return start >= end;
    }
}

你可能感兴趣的:(回溯,java)