力扣hot100 分割回文串 集合 dfs

news/2024/7/20 20:03:46 标签: leetcode, 深度优先, 算法

Problem: 131. 分割回文串
1

文章目录

  • 思路
  • Code
  • 💖 DP预处理版

思路

👨‍🏫 参考题解

Code

在这里插入图片描述

import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
import java.util.List;

public class Solution {
    int n;//字符长度
    List<List<String>> res = new ArrayList<>();
    char[] ss;//字符数组

    public List<List<String>> partition(String s) {
        n = s.length();
        if (n == 0)
            return res;
        ss = s.toCharArray();
        dfs(0, new Stack<String>());
        return res;
    }
// idx 是当前未分割段的起点包含)
// path 是当前已分割的字符串集合
    private void dfs(int idx, Stack<String> path) {
        if (idx == n) //n以前的字符都分割了,结算
        {
            res.add(new ArrayList<String>(path));
            return;
        }
        for (int i = idx; i < n; i++) // i 枚举的是截取的位置
        {
            if (!check(idx, i))//不回文直接跳过
                continue;
            path.add(new String(ss, idx, i + 1 - idx));
            dfs(i + 1, path);// i 是截取的位置,i+1 是未截取段的起点
            path.pop();
        }
    }

// 判断 ss[] 中 [l,r] 区间是否为回文子串,回文返回 true
    private boolean check(int l, int r) {
        while (l < r)
            if (ss[l++] != ss[r--])
                return false;
        return true;
    }
}

💖 DP预处理版

在这里插入图片描述

import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
import java.util.List;

public class Solution {

    public List<List<String>> partition(String s) {
        int len = s.length();
        List<List<String>> res = new ArrayList<>();
        if (len == 0) {
            return res;
        }

        char[] charArray = s.toCharArray();
        // 预处理
        // 状态:dp[i][j] 表示 s[i][j] 是否是回文
        boolean[][] dp = new boolean[len][len];
        // 状态转移方程:在 s[i] == s[j] 的时候,dp[i][j] 参考 dp[i + 1][j - 1]
        for (int right = 0; right < len; right++) {
            // 注意:left <= right 取等号表示 1 个字符的时候也需要判断
            for (int left = 0; left <= right; left++) {
                if (charArray[left] == charArray[right] && (right - left <= 2 || dp[left + 1][right - 1])) {
                    dp[left][right] = true;
                }
            }
        }

        Deque<String> stack = new ArrayDeque<>();
        dfs(s, 0, len, dp, stack, res);
        return res;
    }

    private void dfs(String s, int index, int len, boolean[][] dp, Deque<String> path, List<List<String>> res) {
        if (index == len) {
            res.add(new ArrayList<>(path));
            return;
        }

        for (int i = index; i < len; i++) {
            if (dp[index][i]) {
                path.addLast(s.substring(index, i + 1));
                dfs(s, i + 1, len, dp, path, res);
                path.removeLast();
            }
        }
    }
}

http://www.niftyadmin.cn/n/5354456.html

相关文章

React16源码: React中LegacyContext的源码实现

LegacyContext 老的 contextAPI 也就是我们使用 childContextTypes 这种声明方式来从父节点为它的子树提供 context 内容的这么一种方式遗留的contextAPI 在 react 17 被彻底移除了&#xff0c;就无法使用了那么为什么要彻底移除这个contextAPI的使用方式呢&#xff1f;因为它…

7-上传下载

上传下载 首先创建一张上传文件的表&#xff0c;例如&#xff1a; drop table if exists sys_file_info; create table sys_file_info (file_id int(11) not null auto_increment comment 文件id,file_name varchar(50) default …

Java 面试题之 IO(一)

字节流 文章目录 字节流InputStream&#xff08;字节输入流&#xff09;OutputStream&#xff08;字节输出流&#xff09; 文章来自Java Guide 用于学习如有侵权&#xff0c;立即删除 InputStream&#xff08;字节输入流&#xff09; InputStream用于从源头&#xff08;通常是…

UE5.1_常用节点说明(经常忘记怎么用?)(常改)

UE5.1_常用节点说明&#xff08;经常忘记怎么用&#xff1f;&#xff09;&#xff08;常改&#xff09; 1. Gate——门节点。只有当门是Open状态才会执行Exit后面的代码。 Open开门&#xff1b;Close关门&#xff1b;Toggle开门和关门交替。 2. 关于控制ArmLength即控制相机前…

【美赛必看干货!!】零基础挑战数模美赛M奖

1、美赛是如何评奖的 1.1 美赛获奖如何评审 评审分为三个阶段&#xff1a;浏览、评分和评定 • 浏览阶段一共分为三轮&#xff0c;均采用7分制&#xff08;1分最差&#xff0c;7分最好&#xff09;&#xff0c;前两轮由初评评委完成&#xff0c;评分的依据主要是摘要的质量与…

Python爬虫库推荐

很多人学Python&#xff0c;都是从爬虫开始的&#xff0c;毕竟网上类似的资源很丰富&#xff0c;开源项目也非常多。 Python学习网络爬虫主要分3个大的版块&#xff1a; 抓取 &#xff0c; 分析 &#xff0c; 存储 当我们在浏览器中输入一个url后回车&#xff0c;后台会发生什…

《Docker极简教程》--前言--本书的目的和目标

目的&#xff1a; 本书的目的是为读者提供一个简明扼要、易于理解的Docker学习指南&#xff0c;使他们能够迅速掌握Docker技术的基础知识和实际应用。随着现代软件开发和部署的复杂性不断增加&#xff0c;Docker作为一种轻量级、可移植、自包含的容器技术&#xff0c;已经成为构…

力扣72. 编辑距离

动态规划 思路&#xff1a; 假设 dp[i][j] 是 word1 长度 i 和 word2 长度 j 的编辑距离&#xff1b;有三种编辑方式&#xff1a;插入、删除、替换&#xff0c;即 word1 插入、word2 插入、替换&#xff1b;那么 dp[i][j] 可以是&#xff1a; dp[i - 1][j] 在 word1 中插入一个…