LeetCode算法编程 - Palindrome Partitioning

1、题目

Given a string s, partition s such that every substring of the partition is a palindrome.

Return all possible palindrome partitioning of s.

For example, given s = "aab",
Return

  [
    ["aa","b"],
    ["a","a","b"]
  ]

题目解释:

指定字符串 s,返回 s 所有可能的子串,每个子串必须是一个回文(指顺读和倒读都一样的字符串),示例如上图。

分析

仔细思考一下问题,会发现题目的做法是遍历所有的可能,找出合适的解。大家可以先尝试下自已写这个算法,这道题会考验递归的基本功。

先介绍下回溯算法,回溯算法也叫试探法,它是一种系统地搜索问题的解的方法。回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。用回溯算法解决问题的一般步骤为:

1、定义一个解空间,它包含问题的解。

2、利用适于搜索的方法组织解空间。

3、利用深度优先法搜索解空间。

4、利用限界函数避免移动到不可能产生解的子空间。

问题的解空间通常是在搜索问题的解的过程中动态产生的,这是回溯算法的一个重要特性。

源码:

class Solution {
public:

    // 检查一个字符串是否为回文
    bool check_palindrome(string s)
    {
        int size = s.size();
        for (int i = 0; i < size/2; i ++)
        {
            if (s[i] != s[size - i - 1])
            {
                return false;
            }
        }

        return true;
    }

    void find_partition_sln(string s,
                            vector<string> &sln,
                            vector<vector<string> > &result)
    {
        // 边界结束条件
        if (s.size() == 0)
        {
            // 能到这,说明找到了一个可能的解,前面的子串都是符合条件的
            result.push_back(sln);
        }

        int size = s.size();

        // 把字符串从第一个位置到最后一个位置,依次进行分隔
        // 并在每一种情况下,利用深度搜索找到合适的解
        for (int i = 1; i <= size; i ++)
        {
            string front;
            string remain;

            front.assign(s, 0, i);
            remain.assign(s, i, size - i);

            if (check_palindrome(front))
            {
                // front符合条件
                sln.push_back(front);

                // 寻找以front开头的可行解,深度优先
                find_partition_sln(remain, sln, result);

                // 重新开始下一个查找
                sln.pop_back();
            }
        }
    }

    vector<vector<string> > partition(string s) {

        vector<string> sln;
        vector<vector<string> > result;

        find_partition_sln(s, sln, result);

        return result;
    }
};
时间: 2024-12-14 09:51:43

LeetCode算法编程 - Palindrome Partitioning的相关文章

LeetCode算法编程(两题)

今天看到酷壳推荐的国外编程LeetCode算法编程网站,上面目前有154道算法题,感觉很有意思,平常工作也比较忙,现在很少有时间来锻炼算法相关的东西,有空的时候静下心来,温习下基础,活跃下自已的思路,也是有必要的.先做了几道,后面会陆续补充其它的题目. 1.题目-PlusOne Given a non-negative number represented as an array of digits, plus one to the number. The digits are stored s

leetcode题目:Palindrome Partitioning 和Palindrome Partitioning II

题目一: Given a string s, partition s such that every substring of the partition is a palindrome. Return all possible palindrome partitioning of s. For example, given s = "aab", Return [ ["aa","b"], ["a","a",

LeetCode 笔记24 Palindrome Partitioning II (智商碾压)

Given a string s, partition s such that every substring of the partition is a palindrome. Return the minimum cuts needed for a palindrome partitioning of s. For example, given s = "aab",Return 1 since the palindrome partitioning ["aa",

LeetCode OJ:Palindrome Partitioning(回文排列)

Given a string s, partition s such that every substring of the partition is a palindrome. Return all possible palindrome partitioning of s. For example, given s = "aab",Return [ ["aa","b"], ["a","a","

leetcode || 132、Palindrome Partitioning II

problem: Given a string s, partition s such that every substring of the partition is a palindrome. Return the minimum cuts needed for a palindrome partitioning of s. For example, given s = "aab", Return 1 since the palindrome partitioning ["

leetcode ||131、Palindrome Partitioning

problem: Given a string s, partition s such that every substring of the partition is a palindrome. Return all possible palindrome partitioning of s. For example, given s = "aab", Return [ ["aa","b"], ["a","a&qu

LeetCode算法编程之连载三

1.题目 - Linked List Cycle II Given a linked list, return the node where the cycle begins. If there is no cycle, return null. Follow up: Can you solve it without using extra space? 题目解释: 单链表找环的题目,代码中不开辟新的空间,这道题应该是算法面试和一些书籍上常见的题. 这道题,在读书的时候就做过了,不过很久没有搞类

【leetcode】1278. Palindrome Partitioning III

题目如下: You are given a string s containing lowercase letters and an integer k. You need to : First, change some characters of s to other lowercase English letters. Then divide s into k non-empty disjoint substrings such that each substring is palindro

LeetCode算法编程之连载四(二分法)

1.题目 – Sqrt(x) Implement int sqrt(int x). Compute and return the square root of x. 题目意思很简单,就是求出x的平方根. 分析: 一看这题目,感觉很简单,很容易想到的是二分法,我最开始的解法是从1.2.4.8 … 2 * n,计算出n < x < 2n,然后再在 n 和 2n间,用二分法,找到平方根结果. 这种方法比较麻烦的一点是,乘积是有可能越界的,要处理乘积越界的情况,代码可读性不强. class Solut