首页 > 其他分享 >leetcode-5

leetcode-5

时间:2024-07-27 15:50:46浏览次数:14  
标签:begin int maxLen true leetcode dp 回文

题目:

给你一个字符串 s,找到 s 中最长的 回文子串

示例 1:输入:s = "babad"  输出:"bab"  解释:"aba" 同样是符合题意的答案。

示例 2:输入:s = "cbbd"    输出:"bb"

提示:   1 <= s.length <= 1000  s 仅由数字和英文字母组成

 

推导:

 

代码:

 1 class Solution {
 2 public:
 3     string longestPalindrome(string s) {
 4         int n = s.size();
 5         int maxLen = 1; // 定义最大回文串长度
 6         int begin = 0;
 7         if (n < 2) {
 8             return s;
 9         }
10 
11         // 创建二维数组dp[i][j]
12         vector<vector<int>> dp(n, vector<int>(n));
13 
14         // 首先对对角线上的单个元素形成的回文赋值true
15         for (int i=0; i<n; ++i) {
16             dp[i][i] = true;
17         } 
18 
19         for (int L=2; L<n; ++L) {
20             for (int i=0; i<n; ++i) {
21                 int j = L+i-1; // 起始的 L = 2,所以 j = 2+0-1 = 1,j = L-1+i, 
22                                // 可见 L-1 始终大于0, 因此 j > i
23                 
24                 // 如果右边界越界,则直接结束循环
25                 if (j >= n) {
26                     break;
27                 }
28 
29                 if (s[i] != s[j]) {
30                     dp[i][j] = false; // 如果串的首尾元素不相等,则判断该串 s[i..j] 不是回文串
31                 } else {
32                     if (L < 4){
33                         dp[i][j] = true; // 看笔记,或者博客园
34                     } else {
35                         dp[i][j] = dp[i+1][j-1]; // 看笔记,或者博客园
36                     }
37                 }
38                 if (dp[i][j] == true && L > maxLen) { 
39                     // 这里的比较条件可写为 if dp[i][j]
40                     // 这是因为 dp[i][j] 中仅存放 true/false,dp[i][j] == true 就相当于dp[i][j]
41                     // 后半部分可省略是因为 L 本身是在递增的,而每次循环 maxLen 的最大值总是当前循环的L 
42                     // 因此后面 L 一定比前面的maxLen要大,所以只要出现首尾相等,就说明L更大,因此可以省略
43                     maxLen = L;
44                     begin = i;
45                 }
46             }
47         }
48         return s.substr(begin, maxLen);
49     }
50 };

 

标签:begin,int,maxLen,true,leetcode,dp,回文
From: https://www.cnblogs.com/2277241439qaq/p/18327065

相关文章

  • LeetCode 2976 Minimum Cost to Convert String I
    MinimumCosttoConvertStringIProblemDescriptionYouaregiventwo0-indexedstrings,sourceandtarget,bothoflengthnandconsistingoflowercaseEnglishletters.Youarealsoprovidedwithtwo0-indexedcharacterarrays,originalandchanged,a......
  • 【LeetCode】141.环形链表、142. 环形链表 II(算法 + 图解)
    Hi~!这里是奋斗的明志,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎~~......
  • LeetCode767 重构字符串
    题解通常直接思考最佳策略是十分困难的,我们不妨思考每一种情况需要如何处理:整个字符串只有一种字符若字符串长度为\(1\),那么字符串本身即为答案;若字符串长度大于等于\(2\),那么不存在可行方案整个字符串只有两种字符\(c_1,c_2\),数量分别为\(n_1,n_2\)若字符\(c_1\)的......
  • LeetCode 2.两数相加 java
    力扣链接2.两数相加-力扣(LeetCode)题目描述给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字0之外,这两个数都不会以0......
  • Leetcode 1334 Find the City With the Smallest Number of Neighbors at a Threshold
    Problem:FindtheCityWiththeSmallestNumberofNeighborsataThresholdDistanceTheknowledgepointsoutsideofmyskilltreeExplanationofCodeandConceptsWhatisfloat('inf')?float('inf')inPythonrepresentspositiveinfin......
  • leetcode周赛407
    A.使两个整数相等的位更改次数ac代码:classSolution{public:intminChanges(intn,intk){inta[40]={0},b[40]={0};for(inti=0;i<32;i++)a[i]=n>>i&1;for(inti=0;i<32;i++)b[i]=k>>i&1;i......
  • leetcode 输出错误? (Python)
    我的VSCode/本地终端给出了[1,4,1,5,1,6]的正确输出,但不知何故leetcode给了我完全不同的输出。我在这里错过了什么吗?这怎么可能?顺便说一下,这是wigglesort2将我的本地代码复制粘贴到leetcode中给出了不同的输出数组很难在没有看到你的代码的情况下......
  • leetcode103. 二叉树的锯齿形层序遍历,简单易懂附代码详解
    leetcode103.二叉树的锯齿形层序遍历给你二叉树的根节点root,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。示例1:输入:root=[3,9,20,null,null,15,7]输出:[[3],[20,9],[15,7]]示例2:输入:root=[1]输出:[[1......
  • *算法训练(leetcode)第三十一天 | 1049. 最后一块石头的重量 II、494. 目标和、474. 一
    刷题记录*1049.最后一块石头的重量II*494.目标和474.一和零*1049.最后一块石头的重量IIleetcode题目地址本题与分割等和子集类似,要达到碰撞最后的石头重量最小,则尽可能把石头等分为两堆。时间复杂度:O......
  • LeetCode135. 分发糖果
    题目链接:https://leetcode.cn/problems/candy/description/题目叙述:n个孩子站成一排。给你一个整数数组ratings表示每个孩子的评分。你需要按照以下要求,给这些孩子分发糖果:每个孩子至少分配到1个糖果。相邻两个孩子评分更高的孩子会获得更多的糖果。请你给每个孩子分发......