第五题:最长回文子串(Longest Palindromic Substring)

2024-08-24 13:20

本文主要是介绍第五题:最长回文子串(Longest Palindromic Substring),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目描述:

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

示例:

  1. 输入:s = "babad"
    输出:"bab" 或 "aba"

  2. 输入:s = "cbbd"
    输出:"bb"

要求: 你需要找出 s 中的最长回文子串。

解题思路

方法1:中心扩展法

回文字符串的特点是对称的,因此我们可以从每个字符(或字符间隙)作为中心,向两边扩展来找到回文子串。

  1. 遍历每个字符:对于字符串中的每个字符,尝试以该字符作为回文的中心进行扩展,检查最长回文子串。

  2. 扩展中心

    • 对于每个字符,尝试以其为中心,分别考虑回文长度为奇数和偶数的情况。
    • 对于奇数长度回文,以字符本身为中心进行扩展。
    • 对于偶数长度回文,以字符和其下一个字符之间的位置为中心进行扩展。
  3. 更新最长回文子串:在扩展过程中,更新记录当前找到的最长回文子串的起始位置和长度。

C 语言实现

#include <stdio.h>
#include <string.h>char* longestPalindrome(char* s) {int n = strlen(s);if (n == 0) return "";int start = 0, maxLen = 1;// Helper function to expand around centervoid expandAroundCenter(int left, int right) {while (left >= 0 && right < n && s[left] == s[right]) {if (right - left + 1 > maxLen) {start = left;maxLen = right - left + 1;}left--;right++;}}for (int i = 0; i < n; i++) {expandAroundCenter(i, i); // Odd length palindromesexpandAroundCenter(i, i + 1); // Even length palindromes}char* result = (char*)malloc((maxLen + 1) * sizeof(char));strncpy(result, s + start, maxLen);result[maxLen] = '\0';return result;
}

Java 实现

public class Solution {public String longestPalindrome(String s) {if (s == null || s.length() == 0) return "";int start = 0, maxLen = 1;// Helper function to expand around centerString expandAroundCenter(String s, int left, int right) {while (left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) {left--;right++;}return s.substring(left + 1, right);}for (int i = 0; i < s.length(); i++) {String oddLenPalindrome = expandAroundCenter(s, i, i);String evenLenPalindrome = expandAroundCenter(s, i, i + 1);String longerPalindrome = oddLenPalindrome.length() > evenLenPalindrome.length() ? oddLenPalindrome : evenLenPalindrome;if (longerPalindrome.length() > maxLen) {maxLen = longerPalindrome.length();start = s.indexOf(longerPalindrome);}}return s.substring(start, start + maxLen);}
}

Python 实现

def longestPalindrome(s: str) -> str:def expandAroundCenter(left: int, right: int) -> str:while left >= 0 and right < len(s) and s[left] == s[right]:left -= 1right += 1return s[left + 1:right]if not s:return ""start, max_len = 0, 1for i in range(len(s)):# Odd length palindromespal1 = expandAroundCenter(i, i)# Even length palindromespal2 = expandAroundCenter(i, i + 1)# Determine the longer palindromelonger_pal = pal1 if len(pal1) > len(pal2) else pal2if len(longer_pal) > max_len:start = i - (len(longer_pal) - 1) // 2max_len = len(longer_pal)return s[start:start + max_len]

时间复杂度

时间复杂度: 所有这些实现方法的时间复杂度为 (O(n^2)),其中 (n) 是字符串 s 的长度。虽然扩展中心的过程对于每个字符都需要进行最多 (O(n)) 次操作,但由于要遍历每个字符,所以总体复杂度是 (O(n^2))。

空间复杂度: 每个实现的空间复杂度为 (O(1)) 除了输出空间(用于存储回文子串)。

这篇关于第五题:最长回文子串(Longest Palindromic Substring)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

poj2406(连续重复子串)

题意:判断串s是不是str^n,求str的最大长度。 解题思路:kmp可解,后缀数组的倍增算法超时。next[i]表示在第i位匹配失败后,自动跳转到next[i],所以1到next[n]这个串 等于 n-next[n]+1到n这个串。 代码如下; #include<iostream>#include<algorithm>#include<stdio.h>#include<math.

poj3261(可重复k次的最长子串)

题意:可重复k次的最长子串 解题思路:求所有区间[x,x+k-1]中的最小值的最大值。求sa时间复杂度Nlog(N),求最值时间复杂度N*N,但实际复杂度很低。题目数据也比较水,不然估计过不了。 代码入下: #include<iostream>#include<algorithm>#include<stdio.h>#include<math.h>#include<cstring

spoj705( 求不相同的子串个数)

题意:求串s的不同子串的个数 解题思路:任何子串都是某个后缀的前缀,对n个后缀排序,求某个后缀的前缀的个数,减去height[i](第i个后缀与第i-1 个后缀有相同的height[i]个前缀)。 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#include<math.h>#include<cstrin

csu1328(近似回文串)

题意:求近似回文串的最大长度,串长度为1000。 解题思路:以某点为中心,向左右两边扩展,注意奇偶分开讨论,暴力解即可。时间复杂度O(n^2); 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#include<math.h>#include<cstring>#include<string>#inclu

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

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

hihocoder1050 : 树中的最长路

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上回说到,小Ho得到了一棵二叉树玩具,这个玩具是由小球和木棍连接起来的,而在拆拼它的过程中,小Ho发现他不仅仅可以拼凑成一棵二叉树!还可以拼凑成一棵多叉树——好吧,其实就是更为平常的树而已。 但是不管怎么说,小Ho喜爱的玩具又升级换代了,于是他更加爱不释手(其实说起来小球和木棍有什么好玩的是吧= =)。小Ho手

POJ1631最长单调递增子序列

最长单调递增子序列 import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.math.BigInteger;import java.util.StringTokenizer;publ

计蒜客 Skiing 最长路

In this winter holiday, Bob has a plan for skiing at the mountain resort. This ski resort has MM different ski paths and NN different flags situated at those turning points. The ii-th path from the

PHP最长单一子串

<?php//方法一$s='abcccddddddcdefg';$max='';while($s!=''){$i=0; while($i<strlen($s) && $s[$i]==$s[0]) $i++;if ($i>strlen($max)){$max=substr($s,0,$i);} $s=substr($s,$i);}echo $m