leetcode131 分割回文串

leetcode 131

image-20250109173826563

思路:回溯

比如说aab,对于每个元素currentNum,有两种选择:

1.如果currentNum<len-1,可以将当前元素加入到currentStr中,然后dfs(start,currentNum+1)。而currentNum==len-1时不能dfs(start,currentNum+1),这样下一轮循环就执行以下代码了

if (currentNum == len){
	ans.add(new ArrayList<>(currentList));
	return;
}

会导致最后一个str丢失,并且结果会加入到ans中。

image-20250109183746859

2.如果start到currentNum是回文串,可以取start到currentNum这一字串加到ans中,然后dfs(currentNum+1,currentNum+1)

代码:

class Solution {
    List<List<String>> ans = new ArrayList<>();

    public List<List<String>> partition(String s) {
        dfs(0, 0, s.length(), s, "", new ArrayList<>());
        return ans;
    }

    public void dfs(int startNum, int currentNum, int len, String s, String currentStr, List<String> currentList) {
        //每一位有两种选法,一种是加在上一个String里,另一种是新建String
        if (currentNum == len){
            ans.add(new ArrayList<>(currentList));
            return;
        }
        if (currentNum<len-1){
            dfs(startNum, currentNum + 1, len, s, currentStr, currentList);
        }
        //加在上一个string里
        if (isPalindrome(s, startNum, currentNum)) {
            currentList.add(s.substring(startNum, currentNum+1));
            dfs(currentNum + 1, currentNum + 1, len, s, currentStr, currentList);
            currentList.remove(currentList.size() - 1);
        }
        //
    }
    
    public boolean isPalindrome(String s, int left, int right) {
        while (left < right) {
            if (s.charAt(left) != s.charAt(right)) {
                return false;
            }
            left++;
            right--;
        }
        return true;
    }
}
posted @   vast_joy  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示