菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
283
0

[LeetCode] 131. 分割回文串

原创
05/13 14:22
阅读数 36888

首先标记出所有的回文子串。boolean f[i][j]表示下标[i,j]构成的子串是回文串。

使用中心扩展法来算出整个f数组:枚举每一个下标为回文串的中心,然后逐渐向两边尽可能的扩展。最终O(n^2)跑完f数组。

然后使用dfs枚举出所有可能性

粗心了一下,可惜没有1A

class Solution {
    public List<List<String>> partition(String s) {
        int n = s.length();

        boolean f[][] = new boolean[n][n];
        for (int i = 0; i < n; i++) {
            f[i][i] = true;
        }

        for (int i = 0; i < n; i++) {
            int l = i - 1;
            int r = i + 1;
            while (l >= 0 && r < n) {
                if (s.charAt(l) == s.charAt(r)) {
                    f[l][r] = true;
                } else {
                    break;
                }
                l--;
                r++;
            }

            l = i;
            r = i + 1;
            while (l >= 0 && r < n) {
                if (s.charAt(l) == s.charAt(r)) {
                    f[l][r] = true;
                } else {
                    break;
                }
                l--;
                r++;
            }
        }

        List<List<String>> ans = new ArrayList<>();
        dfs(ans, new ArrayList<>(), f, 0, n, s);

        return ans;
    }

    private void dfs(List<List<String>> ans, List<String> cur, boolean f[][], int k, int n,
            String s) {
        if (k == n) {
            ans.add(cur);
            return;
        }

        for (int i = k; i < n; i++) {
            if (f[k][i]) {
                List<String> next = new ArrayList<>(cur);
                next.add(s.substring(k, i + 1));
                dfs(ans, next, f, i + 1, n, s);
            }
        }
    }
}

发表评论

0/200
283 点赞
0 评论
收藏
为你推荐 换一批