🔥 LeetCode 热题 HOT 100: 05 && 10

65 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情

5. 最长回文子串

一、题目描述: 给你一个字符串 s,找到 s 中最长的回文子串。

示例 1:

输入:s = "babad"

输出:"bab"

解释:"aba" 同样是符合题意的答案。

二、思路分析:

定义布尔类型的二位数组 dp, 当 dp[i][j] 的值为 True 时, 代表 i,j 之间的字符串是回文

状态转移

dp[i][j] = chars[i] != chars[j] ? false : (dp[i + 1][j - 1] || j - i == 1);

三、AC 代码:

class Solution {
    public String longestPalindrome(String s) {
        char[] chars = s.toCharArray();
        int n = chars.length;
        boolean[][] dp = new boolean[n][n];
        for (int i = n - 1; i >= 0; i--) {
            dp[i][i] = true;
            for (int j = i + 1; j < n; j++) {
                if (chars[i] != chars[j]) {
                    dp[i][j] = false;
                } else {
                    dp[i][j] = dp[i + 1][j - 1] || (j - i) == 1;
                }
            }
        }
        String ans = "";
        for (int len = 1; len <= n; len++) {
            for (int l = 0; l + len - 1 < n; l++) {
                int r = l + len - 1;
                if (dp[l][r]) ans = s.substring(l, r + 1);
            }
        }
        return ans;
    }
}

10. 正则表达式匹配

一、题目描述:

给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配。

'.' 匹配任意单个字符 '*' 匹配零个或多个前面的那一个元素 所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。

二、思路分析:

定义布尔类型的二位数组 dp, 当 dp[i][j] 为 true 时,表示 字符串 s 的 0 - i 区域可以与字符串 p 的 0 - j 区域匹配

dp 数组的状态转移

当 chars[j] != '*' 时 dp[i][j] 取决于 dp[i-1][j-] && chars[i] 是否可以于 chars[j] 匹配

当 chars[j] == '*' 时 dp[i][j] 取决于 chars[j-1] 的匹配次数

匹配 0 次 dp[i][j] = dp[i][j - 2]

匹配多次 dp[i][j] = dp[i - 1][j] && chars[i] 是否与 chars[j-1] 匹配

三、AC 代码:


class Solution {
    public boolean isMatch(String s, String p) {
        String ss = " " + s;
        String pp = " " + p;
        int n = s.length();
        int m = p.length();

        boolean[][] dp = new boolean[n + 1][m + 1];
        dp[0][0] = true;

        for (int i = 0; i <= n; i++) {
            for (int j = 0; j <= m; j++) {
                if (j + 1 <= m && pp.charAt(j + 1) == '*') continue;

                if (pp.charAt(j) != '*' && i > 0 && j > 0) {
                    dp[i][j] = (pp.charAt(j) == ss.charAt(i) ||
                            pp.charAt(j) == '.') && dp[i - 1][j - 1];
                }

                if (pp.charAt(j) == '*') {

                    dp[i][j] |= j >= 2 && dp[i][j - 2];

                    dp[i][j] |= i >= 1 && j >= 1 && dp[i - 1][j]
                            && (pp.charAt(j - 1) == ss.charAt(i) ||
                            pp.charAt(j - 1) == '.');
                }
            }
        }

        return dp[n][m];
    }
}