【重点】【回溯】131.分割回文串

本文详细阐述了两种DFS方法,分别应用于字符串分割和回文串判断,展示了如何利用ArrayList和动态规划优化性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目
重点掌握方法2写法!!!

法1:DFS+双指针

Python

class Solution:
    def partition(self, s: str) -> List[List[str]]:
        res = list()
        tmp = list()
        self.dfs(0, s, tmp, res)
        return res

    def dfs(self, idx, s, tmp, res):
        if idx == len(s):
            res.append(tmp.copy())
        
        for i in range(idx, len(s)):
            if self.is_valid(s, idx, i):
                tmp.append(s[idx:i+1])
                self.dfs(i+1, s, tmp, res)
                tmp.pop()
    
    def is_valid(self, s, i, j) -> bool:
        if i < 0 or i >= len(s) or j < 0 or j >= len(s) or i > j:
            return False
        l = i
        r = j
        while l <= r:
            if s[l] == s[r]:
                l += 1
                r -= 1
            else:
                return False
            
        return True

Java

必须掌握基础方法!
注意:使用ArrayList删除尾元素比LinkedList要快很多!!!

class Solution {
    public List<List<String>> partition(String s) {
        List<List<String>> res = new ArrayList<>();
        if (s.length() == 0) {
            return res;
        }
        List<String> tmp = new ArrayList<>();
        dfs(s, 0, tmp, res);

        return res;
    }

    public void dfs(String s, int startIndex, List<String> tmp, List<List<String>> res) {
        if (startIndex == s.length()) {
            res.add(new ArrayList<>(tmp));
            return;
        }
        for (int i = startIndex; i < s.length(); ++i) {
            if (!valid(s, startIndex, i)) {
                continue;
            }
            tmp.add(s.substring(startIndex, i + 1));
            dfs(s, i + 1, tmp, res);
            tmp.remove(tmp.size() - 1);
        }
    }

    public boolean valid(String s, int startIndex, int endIndex) {
        while (startIndex <= endIndex) {
            char left = s.charAt(startIndex);
            char right = s.charAt(endIndex);
            if (left != right) {
                return false;
            }
            ++startIndex;
            --endIndex;
        }

        return true;
    }
}

法2:DFS+回文串判断预处理

主要优化回文串判断部分
在这里插入图片描述

Python

class Solution:
    def partition(self, s: str) -> List[List[str]]:
        n = len(s)
        s_arr = list(s)
        judge = [[0]*n for _ in range(n)] # judge[i][j]表示s[i~j]之间是回文子串
        for i in range(n):
            judge[i][i] = 1
        for i in range(n-2, -1, -1):
            for j in range(i+1, n):
                if s_arr[i] == s_arr[j] and (j-i == 1 or judge[i+1][j-1]):
                    judge[i][j] = 1

        res, tmp = list(), list()
        self.dfs(s, 0, res, tmp, judge)

        return res
    
    def dfs(self, s, start, res, tmp, judge):
        n = len(s)
        if start == n:
            res.append(tmp.copy())

        for i in range(start, n):
            if judge[start][i]:
                tmp.append(s[start: i+1])
                self.dfs(s, i+1, res, tmp, judge)
                tmp.pop() # 回溯: 恢复现场

Java

class Solution {
    public List<List<String>> partition(String s) {
        List<List<String>> res = new ArrayList<>();
        int n = s.length();
        boolean[][] dp = new boolean[n][n]; // dp[i][j]表示s[i:j]之间是回文串
        for (int i = 0; i < n; ++i) {
            dp[i][i] = true;
        }
        for (int i = n - 1; i >= 0; --i) {
            for (int j = i + 1; j < n; ++j) {
                dp[i][j] = (s.charAt(i) == s.charAt(j)) && (j - i == 1 || dp[i + 1][j - 1]);
            }
        }
        List<String> tmp = new ArrayList<>();
        dfs(s, res, tmp, dp, 0);

        return res;
    }

    public void dfs(String s, List<List<String>> res, List<String> tmp, boolean[][] dp, int curInx) {
        if (curInx == s.length()) {
            res.add(new ArrayList<>(tmp));
            return;
        }
        for (int i = curInx; i < s.length(); ++i) {
            if (dp[curInx][i]) {
                tmp.add(s.substring(curInx, i + 1));
                dfs(s, res, tmp, dp, i + 1);
                tmp.remove(tmp.size() - 1);
            }
        }
    }
}
内容概要:该论文深入研究了液压挖掘机动臂下降势能回收技术,旨在解决传统液压挖掘机能耗高的问题。提出了一种新型闭式回路势能回收系统,利用模糊PI自整定控制算法控制永磁无刷直流电动机,实现了变转速容积调速控制,消除了节流和溢流损失。通过建立数学模型和仿真模型,分析了不同负载下的系统性能,并开发了试验平台验证系统的高效性和节能效果。研究还涵盖了执行机构能量分布分析、系统元件参数匹配及电机控制性能优化,为液压挖掘机节能技术提供了理论和实践依据。此外,通过实验验证,该系统相比传统方案可降低28%的能耗,控制系统响应时间缩短40%,为工程机械的绿色化、智能化发展提供了关键技术支撑。 适合人群:从事工程机械设计、制造及维护的工程师和技术人员,以及对液压系统节能技术感兴趣的科研人员。 使用场景及目标:①理解液压挖掘机闭式回路动臂势能回收系统的原理和优势;②掌握模糊PI自整定控制算法的具体实现;③学习如何通过理论建模、仿真和实验验证来评估和优化液压系统的性能。 其他说明:此研究不仅提供了详细的理论分析和数学建模,还给出了具体的仿真代码和实验数据,便于读者在实际工作中进行参考和应用。研究结果表明,该系统不仅能显著提高能源利用效率,还能延长设备使用寿命,降低维护成本,具有重要的工程应用价值。
好的,这是一个有趣的问题,使用 Kotlin 可以很方便地解决。 我的思路是使用回溯法,遍历所有可能的分割方式,并判断每个子串是否为回文串。 具体实现细节如下: 首先定义一个函数 `isPalindrome` 用于判断一个字符串是否为回文串,这个函数的实现非常简单,只需要判断字符串正着读和反着读是否相等即可。 ```kotlin fun isPalindrome(str: String): Boolean { return str == str.reversed() } ``` 接下来定义一个函数 `partition` 用于遍历所有可能的分割方式。这个函数的参数包括原始字符串 `s`,当前处理到的位置 `start`,当前已经分割出来的子串列表 `cur`,以及最终的结果列表 `res`。 在这个函数中,我们首先判断当前位置是否已经到达字符串末尾。如果是,就把当前的分割方案添加到结果列表中。否则,我们从当前位置开始往后遍历,尝试分割出一个回文子串。如果找到了一个回文子串,我们就把它添加到子串列表中,然后递归处理后面的子串。最后,记得要回溯到上一个状态,把添加的子串从列表中移除。 ```kotlin fun partition(s: String, start: Int, cur: MutableList<String>, res: MutableList<List<String>>) { if (start == s.length) { res.add(cur.toList()) return } for (i in start until s.length) { val str = s.substring(start, i + 1) if (isPalindrome(str)) { cur.add(str) partition(s, i + 1, cur, res) cur.removeAt(cur.lastIndex) } } } ``` 最后,我们可以在主函数中调用 `partition` 函数,并返回结果列表。完整代码如下: ```kotlin fun isPalindrome(str: String): Boolean { return str == str.reversed() } fun partition(s: String, start: Int, cur: MutableList<String>, res: MutableList<List<String>>) { if (start == s.length) { res.add(cur.toList()) return } for (i in start until s.length) { val str = s.substring(start, i + 1) if (isPalindrome(str)) { cur.add(str) partition(s, i + 1, cur, res) cur.removeAt(cur.lastIndex) } } } fun partition(s: String): List<List<String>> { val res = mutableListOf<List<String>>() partition(s, 0, mutableListOf(), res) return res } ``` 你可以使用以下代码测试这个函数: ```kotlin fun main() { val s = "aab" val res = partition(s) println(res) } ``` 输出结果为: ``` [[a, a, b], [aa, b]] ``` 这说明我们的代码已经正确地找到了字符串所有可能的回文子串分割方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值