LeetCode 0005 —— 5. 最长回文子串

devtools/2025/3/13 23:17:28/

题目:

5. 最长回文子串
给你一个字符串 s,找到 s 中最长的回文子串。示例 1:输入:s = "babad"输出:"bab"解释:"aba" 同样是符合题意的答案。示例 2:输入:s = "cbbd"输出:"bb"示例 3:输入:s = "a"输出:"a"示例 4:输入:s = "ac"输出:"a"提示:1 <= s.length <= 1000s 仅由数字和英文字母(大写和/或小写)组成

解:

算法?不存在的,我上来就是一个for循环,里面再套一个for循环,很快啊。。。

public static String longestPalindrome(String s) {String result = "";int resultLength = 0;// 应付ABA形式的回文for (int i = 0; i < s.length(); i++) {int temLength = 1;String temResult = "";temResult += s.charAt(i);for (int j = 1; j <= s.length(); j++) {if ((i + j) <= s.length() - 1 && (i - j) >= 0 && s.charAt(i - j) == s.charAt(i + j)) {temResult = s.charAt(i - j) + temResult + s.charAt(i - j);temLength += 2;} else {break;}}if (temLength > resultLength) {result = temResult;resultLength = temLength;}}// 应付ABBA形式的回文for (int i = 0; i < s.length() - 1; i++) {if (s.charAt(i) != s.charAt(i + 1)) {continue;}int temLength = 2;String temResult = "";temResult = temResult + s.charAt(i) + s.charAt(i + 1);for (int j = 1; j <= s.length(); j++) {if ((i + 1 + j) <= s.length() - 1 && (i - j) >= 0 && s.charAt(i - j) == s.charAt(i + 1 + j)) {temResult = s.charAt(i - j) + temResult + s.charAt(i - j);temLength += 2;} else {break;}}if (temLength > resultLength) {result = temResult;resultLength = temLength;}}return result;
}

哈哈哈,直接被KO:
在这里插入图片描述

开始开动脑筋想办法,,,

动态规划,
dp[i][j] 表示 s[i..j] 是否是回文子串
首先每个字符本身都是回文子串,所以 dp[i][i] = true
我们用 babab 举例:

    b a b a b
b   1 0 0 0 0
a     1 0 0 0
b       1 0 0
a         1 0
b           1

下半区是不存在的,因为从1到3,但是没有从3到1,这是没有意义的。

然后我们可以找到状态转移方程:
如果遍历到了 i, j:

  • 首先是 如果 s[i] != s[j], [i..j] 肯定不是个回文子串,所以 dp[i][j] = false
  • 如果 s[i] == s[j], 那么 dp[i][j] = dp[i + 1][j - 1] + 2
    怎么理解呢,比如:
    baab, 如果 i=0 (b), j=3 (b), 此时,s[i] 是等于 s[j]的,那么 dp[0][3] = dp[1][2]
    相当于,如果 dp[1][2] 是回文子串,那么在原本的回文串的首尾加上一个相同的字符,新的子串自然也是回文串
    如果 dp[1][2] 不是回文子串, 那么 dp[0][3] 也不是回文子串。

然后讨论一下边界情况:

  • 如果 i == j, 那么 dp[i][j] = true,因为一个字符肯定是回文子串。
  • 然后如果 i + 1 == j, 那么 dp[i][j] = (s[i] == s[j]),因为两个字符相邻,那么就取决于这俩字符串是否是一个字符。

然后遍历的时候,我们从不同的长度,然后不停地从头到尾遍历就可以了。

public static String longestPalindrome(String s) {int n = s.length();boolean[][] dp = new boolean[n][n];int startIndex = 0;int maxLen = 1;// L 表示子串的长度for (int L = 1; L <= n; L++) {// start 表示 子串的起始位置for (int start = 0; start < n; start++) {// end 表示 子串的结束位置int end = start + L - 1;// 如果 end >= n,说明已经越界,结束循环if (end >= n) {break;}if (s.charAt(start) == s.charAt(end)) {if (end - start <= 1) {// 如果i j 相邻 或者 i == j,那么 dp[i][j] = truedp[start][end] = true;} else {// 如果i j 不相邻if (dp[start + 1][end - 1]) {// 如果 dp[i + 1][j - 1] 也是回文,那么 dp[i][j] = dp[i + 1][j - 1] + 2dp[start][end] = true;} else {// 如果 dp[i + 1][j - 1] 不是回文,那么 dp[i][j] = 0dp[start][end] = false;}}}if (dp[start][end] && (end - start + 1 > maxLen)) {startIndex = start;maxLen = end - start + 1;}}}return s.substring(startIndex, startIndex + maxLen);
}

Over!


http://www.ppmy.cn/devtools/166880.html

相关文章

【Linux】:封装线程

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家带来封装线程相关的知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通 数据结…

Qt配置OpenGL相机踩的坑

项目根据LearnOpenGL配置Qt的相机&#xff0c;更新view矩阵和project矩阵的位移向量变得很大&#xff0c;我设置的明明相机位置是(0,0,3)&#xff0c;理想的位移向量刚好是相反数(0,0,-3)&#xff0c;对应的view矩阵位置向量可以变成(0,0,1200)…离模型非常远矩阵模型也看不见&…

Prompt engineering设计原则(一)

目录 一、清晰具体的prompt1. 使用分隔符2. 结构化的输出&#xff08;JSON&#xff09;3. 要求模型检查是否满足条件4. 提供少量案例 二、给模型时间去思考1.指定完成任务所需的步骤2. 指导模型在下结论之前找出一个自己的解法 一、清晰具体的prompt 一个合理的prompt设计决定…

大语言模型学习--向量数据库Milvus实践

Milvus是目前比较流行的开源向量数据库&#xff0c;其官网地址 Milvus 是什么&#xff1f; | Milvus 文档 1.Milvus简介 Milvus 是一种高性能、高扩展性的向量数据库。Milvus 提供强大的数据建模功能&#xff0c;能够将非结构化或多模式数据组织成结构化的 Collections。它支…

一、Jenkins简单配置(使用语言、凭证、SSH)

这里简单讲一下jenkins的使用配置。 一、登陆系统 我们访问jenkins的界面的时候&#xff0c;被要求输入管理员密码&#xff0c;密码可以通过以下方式获取。 # 查看密码&#xff0c; 需要记住这个初始密码 # 在创建角色之后&#xff0c;这个保存密码的文件就会被删除 docker …

NGINX介绍--鱼皮老师课程学习笔记

世界上最受欢迎的web服务器、高性能负载均衡器、反向代理、API网关和内容缓存 Nginx能部署网站&#xff0c;比其他服务器用更少的资源&#xff0c;同时处理更多的用户请求&#xff0c;让网站速度更快更稳定 一、安装nginx windows双击exe启动 linux系统手动编译该目录 sudo …

CTFshow 【WEB入门】信息搜集 【VIP限免】 web1-web17

CTFshow 【 WEB入门】、【VIP限免】 web1 ----源码泄露 首先第一步&#xff0c;看源代码 web2----前台JS绕过 简单点击查看不了源代码&#xff0c;可以强制查看 比如 Ctrl Shift ICtrl U或者在url前加一个view-source: view-source:http://79999ca1-7403-46da-b25b-7ba9…

机器人匹诺曹机制,真话假话平衡机制

摘要&#xff1a; 本文聚焦于机器人所采用的一种“匹诺曹机制”&#xff0c;该机制旨在以大概率保持“虚拟鼻子”&#xff08;一种象征虚假程度的概念&#xff09;不会过长&#xff0c;通过在对话中夹杂真话与假话来实现。文章深入探讨了这一机制的原理&#xff0c;分析其背后的…