5. 最长回文子串
给你一个字符串 s,找到 s 中最长的回文
子串
。
如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。
示例 1:
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
示例 2:
输入:s = "cbbd"
输出:"bb"
提示:
1 <= s.length <= 1000
s 仅由数字和英文字母组成
class Solution { public String longestPalindrome(String s) { if (s == null || s.length() < 1) { return ""; } int len = s.length(); boolean[][] dp = new boolean[len][len]; //dp数组表数s中的第i个字符到第j个字符是否为回文串 for (int i = 0; i < len; i++) { dp[i][i] = true; } int start = 0; int maxLen = 1; char[] chars = s.toCharArray(); for (int L = 2; L <= len; L++) { for (int i = 0; i < len; i++) { int j = i + L - 1; if (j >= len) break; //左侧下标越界 if(chars[i] != chars[j]) dp[i][j] = false; else if (L == 2) dp[i][j] = true; else dp[i][j] = dp[i + 1][j - 1]; if (dp[i][j] && L > maxLen) { start = i; maxLen = L; } } } return s.substring(start, start + maxLen); } }
139. 单词拆分
给你一个字符串 s 和一个字符串列表 wordDict 作为字典。
如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true。
注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。
示例 1:
输入: s = "leetcode", wordDict = ["leet", "code"]
输出: true
解释: 返回 true 因为 "leetcode" 可以由 "leet" 和 "code" 拼接成
示例 2:
输入: s = "applepenapple", wordDict = ["apple", "pen"]
输出: true
解释: 返回 true 因为 "applepenapple" 可以由 "apple" 和 "pen" 拼接成
示例 3:
输入: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"]
输出: false
1 <= s.length <= 300
1 <= wordDict.length <= 1000
1 <= wordDict[i].length <= 20
s 和 wordDict[i] 仅由小写英文字母组成
wordDict 中的所有字符串 互不相同
class Solution { /** * @author XiSoil * @date 2024/04/24 20:51 *执行分布用时2ms,击败的95.87%Java用户 *消耗内存分布40.73MB,击败的95.03%Java用户 **/ public boolean wordBreak(String s, List<String> wordDict) { //特殊情况 if (s == null || s.isEmpty() || wordDict == null || wordDict.isEmpty()) { return false; } //定义一个数组,用于记录每个位置是否可以切割 boolean[] dp = new boolean[s.length() + 1]; //初始化,第一个位置可以切割 dp[0] = true; //遍历字符串,从第二个位置开始 for (int i = 1; i<=s.length(); i++){ //遍历字典,判断当前位置是否可以切割 for (String word : wordDict){ //如果当前位置可以切割,且当前位置的前缀在字典中,则当前位置可以切割 if (s.startsWith(word, i - word.length()) && dp[i - word.length()]){ dp[i] = true; break; } } } return dp[s.length()]; } }
221. 最大正方形
在一个由 '0' 和 '1' 组成的二维矩阵内,找到只包含 '1' 的最大正方形,并返回其面积。
示例1:
输入:matrix = [
["1","0","1","0","0"],
["1","0","1","1","1"],
["1","1","1","1","1"],
["1","0","0","1","0"]
]
输出:4
示例2:
输入:matrix = [
["0","1"],
["1","0"]
]
输出:1
示例 3:
输入:matrix = [["0"]]
输出:0
提示:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 300
matrix[i][j] 为 '0' 或 '1'
class Solution { public static void main(String[] args) { char[][] matrix = { {'1', '0', '0'}, {'1', '0', '1'}, {'1', '1', '1'}, {'1', '0', '1'}, {'1', '1', '1'} }; Solution solution = new Solution(); int result = solution.maximalSquare(matrix); System.out.println(result); } /** * @author XiSoil * @date 2024/04/24 17:54 *执行分布用时6ms,击败的88.36%Java用户 *消耗内存分布55.93MB,击败的82.42%Java用户 **/ public int maximalSquare(char[][] matrix) { int m = matrix.length;//行 int n = matrix[0].length;//列 if (matrix == null || m == 0 || n == 0) { return 0; } int[][] dp = new int[m][n]; int max = 0; for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (matrix[i][j] == '1') { if (i == 0 || j == 0) { dp[i][j] = 1; } else { dp[i][j] = Math.min(dp[i - 1][j], Math.min(dp[i][j - 1], dp[i - 1][j - 1])) + 1; } } max = Math.max(max, dp[i][j]); } } return max * max; } }
又是动态规划的一天
~( ̄▽ ̄)~*