Palindrome Partitioning I II@LeetCode

Palindrome Partitioning

递归解法。遍历每一种组合情况,其实这样的解法并不是很高效,但是还是是可以顺利AC

实现代码:

javapublic class Solution {
    public List<List<String>> partition(String s) {
        List<List<String>> result = new LinkedList<List<String>>();
        generate(result, new LinkedList<String>(), s);
        return result;
    }

    private void generate(List<List<String>> result, LinkedList<String> list, String s) {
        if (s.length() == 0) {
            List<String> res = new LinkedList<String>(list);
            result.add(res);
            return;
        }
        int length = s.length();
        for (int i = 1; i <= length; i++) {
            String sub = s.substring(0, i);
            if (isPalindrome(sub)) {
                list.add(sub);
                generate(result, list, s.substring(i, length));
                list.remove(list.size() - 1);
            }
        }
    }

    private boolean isPalindrome(String s) {
        int len = s.length();
        for (int i = 0; i < len / 2; i++) {
            if (s.charAt(i) != s.charAt(len - 1 - i)) {
                return false;
            }
        }
        return true;
    }
}

Palindrome Partitioning II

动态规划。维护一个boolean[][] isPalindrome二维数组,isPalindrome[i][j]表示s.substring(i, j)是否为回文串。递推公式:检查s.charAt(begin)s.charAt(end)是否相等,如果相等就检查isPalindrome[begin + 1][end - 1]的值,也就是对一个isPalindrome[begin][end]的赋值复杂度是O(1)。另外维护一个numOfCuts数组,numOfCuts[i]表示分割s.substring(1, i)最少需要几个cut,这个值需要在每次找到一个回文串的时候就相应的更新一遍。

简单来说,就是找出所有的回文串,找的方法就是先判断当前起点和终点字符串是否相等,如果相等就进一步检查起点和终点之间的字符串是否是回文的,找到了回文串之后表示从当前起点前的位置到当前终点只需切一刀即可分割,以此与已有的分割方案进行比较即可。

实现代码:

javapublic class Solution {

    public int minCut(String s) {
        int length = s.length();
        boolean[][] isPalindrome = new boolean[length][length];
        int[] numOfCuts = new int[length + 1];
        numOfCuts[0] = -1;
        for (int i = 1; i < length + 1; i++) {
            numOfCuts[i] = numOfCuts[i - 1] + 1;
        }
        for (int end = 0; end < length; end++) {
            for (int begin = end; begin >= 0; begin--) {
                if (s.charAt(begin) == s.charAt(end) && (end - begin < 2 || isPalindrome[begin + 1][end - 1])) {
                    isPalindrome[begin][end] = true;
                    numOfCuts[end + 1] = Math.min(numOfCuts[end + 1], numOfCuts[begin] + 1);
                }
            }
        }
        return numOfCuts[numOfCuts.length - 1];
    }
}

1.1k 声望
63 粉丝
0 条评论
推荐阅读
关于 C++ vector 的两个小 tips
本来这篇文章标题我想起成《关于 vector 的两个小坑》,后来想想,其实也不算是坑,还是自己对原理性的东西理解的没做那么透彻。工作中遇到的很多问题,后来归根到底都是基础不牢靠。

findingea阅读 1.4k

刷完15道js版dp题,面试再也不怕了
某个男人 动态规划,而我作为一个致力称为厨师界最会写算法的前端,总得刷上一部分题,有那么一点发现吧,现在我们就来聊聊,菜鸡如我,发现了什么。

hellocoder20281阅读 357

力扣之 4 的幂 & 3 的幂 & 2 的幂(递归思想)
题目描述给定一个整数,写一个函数来判断它是否是 4 的幂次方。如果是,返回 true ;否则,返回 false 。整数 n 是 4 的幂次方需满足:存在整数 x 使得 n == 4x示例 1: {代码...} 示例 2: {代码...} 示例 3: {...

水冗水孚1阅读 675

力扣之仅仅反转字母(双指针方式)
题目描述给你一个字符串 s ,根据下述规则反转字符串:所有非英文字母保留在原有位置。所有英文字母(小写或大写)位置反转。返回反转后的 s 。示例 1: {代码...} 示例 2: {代码...} 示例 3: {代码...}  力扣...

水冗水孚1阅读 525

力扣之回文数(双指针中的对撞指针公式模板)
什么双指针没刷算法之前,一听双指针,感觉很厉害的样子。实际上呢?也的确是一个不错的解题思路方式。在LeetCode上的双指针是一大类题目的解决方式,看一下,发现有近200题是双指针类型的,如下图:由此可见,双...

水冗水孚阅读 961

力扣之反转字符串之原地修改输入数组(双指针方式)
题目描述编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。示例 1: {代码...}...

水冗水孚阅读 879

封面图
代码随想录打卡day2
977,有序数组的平方排序 {代码...} 209,长度最小的子序列方法:滑动窗口 {代码...} 59,螺旋矩阵方法:找规律 {代码...}

赵钱什么李阅读 733

1.1k 声望
63 粉丝
宣传栏