• 131.分割回文串


    在这里插入图片描述

    // 定义一个名为Solution的类
    class Solution {
    
        // 声明一个成员变量,用于存储所有满足条件的字符串子序列划分结果
        List<List<String>> lists = new ArrayList<>(); 
    
        // 声明一个成员变量,使用LinkedList实现的双端队列,用于临时存储当前的回文子串
        Deque<String> deque = new LinkedList<>();
    
        // 公共方法:partition,输入一个字符串s,返回所有可能的回文子序列划分结果
        public List<List<String>> partition(String s) {
            // 调用回溯法进行字符串划分处理
            backTracking(s, 0);
            // 返回所有找到的回文子序列划分集合
            return lists;
        }
    
        // 私有辅助方法:backTracking,采用回溯算法遍历字符串s的所有可能划分
        private void backTracking(String s, int startIndex) {
            // 当起始位置大于等于字符串s的长度时,说明已经找到一组合法的回文子序列划分,将其添加到结果集中
            if (startIndex >= s.length()) {
                // 将deque中的回文子串列表复制一份添加到结果集lists中
                lists.add(new ArrayList<>(deque));
                return;
            }
    
            // 遍历从startIndex开始到字符串末尾的所有可能划分点
            for (int i = startIndex; i < s.length(); i++) {
                // 判断从startIndex到i(含)之间的子串是否为回文串
                if (isPalindrome(s, startIndex, i)) {
                    // 若是回文串,则将该子串添加到deque中
                    String str = s.substring(startIndex, i + 1);
                    deque.addLast(str);
                } else {
                    // 若不是回文串,则跳过本次循环继续尝试下一个子串
                    continue;
                }
    
                // 继续递归处理剩余部分字符串,同时确保不会重复处理已划分的部分
                backTracking(s, i + 1);
    
                // 回溯:在尝试完当前子串之后,将其从deque中移除,以便于尝试下一种可能的划分方式
                deque.removeLast();
            }
        }
    
        // 私有辅助方法:isPalindrome,用于判断给定索引范围内的子串是否为回文串
        private boolean isPalindrome(String s, int startIndex, int end) {
            // 双指针从两端向中间遍历,比较字符是否相等
            for (int i = startIndex, j = end; i < j; i++, j--) {
                if (s.charAt(i) != s.charAt(j)) {
                    // 如果发现有不相等的字符,则立即返回false,表示该子串不是回文串
                    return false;
                }
            }
            // 所有字符都匹配成功,说明子串是回文串,返回true
            return true;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59

    上述代码定义了一个名为 Solution 的类,该类用于解决一个问题:将一个输入字符串 s 划分成多个子串,使得这些子串都是回文串。通过回溯算法,找出所有可能的回文子序列划分,并将结果以 List 的形式返回。

  • 相关阅读:
    C语言绘图
    Type-C接口介绍
    Spring之AOP
    Java基础面试题(背诵篇)
    【UE 材质】力场护盾和冲击波效果
    Django模版层
    四种进制转换(附java实现代码)
    golang - 使用有缓冲通道控制并发数
    Flink学习第七天——Flink核心的Source Operator实战
    数聚生态,智驭全界!看天翼云如何为智慧园区注入新动能!
  • 原文地址:https://blog.csdn.net/qq_52680399/article/details/136588976