LeetCode | Longest Palindromic Substring

2024-08-25 18:08

本文主要是介绍LeetCode | Longest Palindromic Substring,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目


Given a string S, find the longest palindromic substring in S. You may
assume that the maximum length of S is 1000, and there exists one
unique longest palindromic substring.

最长回文串问题,网上也有超多的教程…
我就不班门弄斧了,只写一点自己的写作思路好了

思路


暴力解法

从第一位开始遍历,每次设置遍历区域为当前到最后一位,再判断这个区域是否回文,O(n^3)。在提交之前就被我否决了

从中间扩展

在上一种方法中,回文串的特殊规律没有被很好地利用。即回文串是两边对等的。所以可以从中间任意一点出发向两头扩展,这样可以在O(n)的时间内得到这一点的回文串最长长度。
整体复杂度O(n^2) 空间复杂度O(1)

动态规划

使用动态规划的思路,dp[i][j]表示i~j是否为回文字符串。

dp[i][j]为回文串,当且仅当:
i==j
i+1==j && s[i]==s[j]
dp[i+1][j-]为回文串并且 s[i]==s[j]

无后效性 设有回文串i~j,那么i-1~j+1串是否为回文串,不受i+1~j-1串的影响。它只与当前状态i~j有关
最优子结构 要求出最长回文子串dp[i][j],那么每部分(dp[i-1][j-1]开始)都必须是回文子串

class Solution {
public://动态规划法 时间O(n^2) 空间O(n^2)
//     string longestPalindrome(string s) {
//         int n=s.size();
//         int dp[n][n];
//         memset(dp,0,sizeof(dp));
//         for(int i=0;i<n;i++) dp[i][i]=1;//      for(int i=n-1;i>=0;i--){
//          for(int j=i+1;j<n;j++){
//              if(s[i]==s[j]){
//                  if(j==i+1) dp[i][j]=1;
//                  else dp[i][j]=dp[i+1][j-1];
//              } 
//          }
//      }
//      int max=0;
//      string target="";
//      for(int i=0;i<n;i++){
//          for(int j=i;j<n;j++){
//              if(dp[i][j]>0 && j-i+1>max)
//              {
//                  max=j-i+1;
//                  target=s.substr(i,j-i+1);
//              }
//          }
//      }
//         return target;
//     }//由中间扩展,时间O(n^2) 空间O(1)string longestPalindrome(string s) {int n=s.size();if(n==1) return s;string target("");for(int i=0;i<n;i++){//这样似乎是O(n^3)复杂度// for(int j=1;j<=1000 && i+j<n;j++){//     if(isReverse(s,i,i+j)){//         if(j>longest){//             longest=j;//             target=s.substr(i,i+j);//         }//     }// }int length=0,left=i,right=i;//尝试从第i个出发,往两边扩展if(i>0 && s[i]==s[i-1]){//如果是这种,有可能是abba类型的left=i-1;printf("possible");target=updateTarget(s,length,left,right,target);}//普通的类型,比如aba//所有的都应当执行一下这种length=-1,left=i,right=i;target=updateTarget(s,length,left,right,target);}return target;}//更新最长子串的函数,从left和right出发向两侧寻找string updateTarget(string s,int length,int left,int right,string target){int n=s.size();while(s[left]==s[right]){length+=2;if(left==0 || right==n-1) break;left--;right++;}if(s[left]!=s[right]){left++;right--;}if(right-left+1>target.size()){int longest=right-left+1;target=s.substr(left,longest);}return target;}
};

另外记录一下之前自己错误的思路

        //这是一个自以为正确的dp//我以dp[i][j]保存了二者之间的最长长度//dp[i][j]=dp[i+1][j-1]+2  or   max(dp[i][j-1],dp[i+1][j]);//但是这是有问题的。//我们不能知道s[i]==s[j]的情况下,它是否是回文串//所以dp[i][j]应当保存i~j是否为回文,而其长度可以直接得出 
//      for(int i=0;i<n;i++) dp[i][i]=1;
//      
//      for(int i=n-1;i>=0;i--){
//          for(int j=i+1;j<n;j++){
//              if(s[i]==s[j])
//              dp[i][j]=dp[i+1][j-1]+2;
//              else 
//              dp[i][j]=max(dp[i][j-1],dp[i+1][j]);
//          }
//      }
//      int max=1;
//      for(int i=0;i<n;i++){
//          for(int j=0;j<n;j++){
//              if(dp[i][j]>max) max=dp[i][j];
//          }
//      }
//      printf("max %d\n",max);

这篇关于LeetCode | Longest Palindromic Substring的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1106272

相关文章

Java 字符串操作之contains 和 substring 方法最佳实践与常见问题

《Java字符串操作之contains和substring方法最佳实践与常见问题》本文给大家详细介绍Java字符串操作之contains和substring方法最佳实践与常见问题,本文结合实例... 目录一、contains 方法详解1. 方法定义与语法2. 底层实现原理3. 使用示例4. 注意事项二、su

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

usaco 1.2 Palindromic Squares(进制转化)

考察进制转化 注意一些细节就可以了 直接上代码: /*ID: who jayLANG: C++TASK: palsquare*/#include<stdio.h>int x[20],xlen,y[20],ylen,B;void change(int n){int m;m=n;xlen=0;while(m){x[++xlen]=m%B;m/=B;}m=n*n;ylen=0;whi

leetcode-24Swap Nodes in Pairs

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode swapPairs(L

leetcode-23Merge k Sorted Lists

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode mergeKLists

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

【JavaScript】LeetCode:16-20

文章目录 16 无重复字符的最长字串17 找到字符串中所有字母异位词18 和为K的子数组19 滑动窗口最大值20 最小覆盖字串 16 无重复字符的最长字串 滑动窗口 + 哈希表这里用哈希集合Set()实现。左指针i,右指针j,从头遍历数组,若j指针指向的元素不在set中,则加入该元素,否则更新结果res,删除集合中i指针指向的元素,进入下一轮循环。 /*** @param

LeetCode:64. 最大正方形 动态规划 时间复杂度O(nm)

64. 最大正方形 题目链接 题目描述 给定一个由 0 和 1 组成的二维矩阵,找出只包含 1 的最大正方形,并返回其面积。 示例1: 输入: 1 0 1 0 01 0 1 1 11 1 1 1 11 0 0 1 0输出: 4 示例2: 输入: 0 1 1 0 01 1 1 1 11 1 1 1 11 1 1 1 1输出: 9 解题思路 这道题的思路是使用动态规划