首页 > 其他分享 >第五题:最长回文子串(Longest Palindromic Substring)

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

时间:2024-08-24 09:24:49浏览次数:12  
标签:right Palindromic len Substring start length Longest left 回文

题目描述:

给定一个字符串 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 center
    void 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 palindromes
        expandAroundCenter(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 center
        String 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 -= 1
            right += 1
        return s[left + 1:right]
    
    if not s:
        return ""
    
    start, max_len = 0, 1
    for i in range(len(s)):
        # Odd length palindromes
        pal1 = expandAroundCenter(i, i)
        # Even length palindromes
        pal2 = expandAroundCenter(i, i + 1)
        # Determine the longer palindrome
        longer_pal = pal1 if len(pal1) > len(pal2) else pal2
        if len(longer_pal) > max_len:
            start = i - (len(longer_pal) - 1) // 2
            max_len = len(longer_pal)
    
    return s[start:start + max_len]

时间复杂度

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

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

标签:right,Palindromic,len,Substring,start,length,Longest,left,回文
From: https://blog.csdn.net/weixin_56644618/article/details/141490530

相关文章

  • CF568E Longest Increasing Subsequence 题解
    Description给定一个长度为\(n\)的有\(k\)个空缺的序列。你有\(m\)个数可以用于填补空缺。要求最大化最长上升子序列的长度。\(n,m\le10^5\),\(k\le10^3\)。Solution容易发现只需要先构造出LIS上的位置的值,对于其余未填位置随便填,所以构造LIS时就不需要考虑出......
  • CF873B Balanced Substring
    Abstract传送门本题定义平衡串为0和1数量相等的字符串,要求我们找出给定01串中含有的最大平衡串。Idea如果把1视为+1,0视为-1,那么一个01串是平衡串当且仅当其和值为0,那么问题就转变为寻找给定01串中和值为0的最长子段。首先做一个前缀和,a[i]表示前i项的......
  • 题解:[ABC363D] Palindromic Number
    提示特定位数的回文数数量是可以快速计算出来的,对于特定的位数\(n\),第一位由于不能有前导\(0\),共有\(9\)种选择,而从第\(2\)位到第\(\frac{n+1}{2}\)位都有\(10\)种选择(一个回文数完全由它的前半部分确定)。所以\(n\)位数中共有\(S(n)=9*10^\frac{n-1}{2}......
  • mysql中substring_index类似split分组功能
     这条MySQL语句中使用了substring_index函数来处理training_pictures列的数据。下面是该函数的具体用法:substring_index(str,delim,count):这个函数会返回字符串str中第count个出现的分隔符delim之前的所有字符,或者之后的所有字符(取决于count的正负)。具体到你提供的查询:s......
  • Solution - Atcoder ABC280Ex Substring Sort
    对于这种子串问题,且有多个基础串,一个比较直观的想法就是先上个广义SAM。考虑SAM与字典序如何联系上。因为跳\(\operatorname{fail}\)相当于是删除子串的一个前缀,直接这样子明显是不行的,因为跳了\(\operatorname{fail}\)字典序没有一个很直观地表示。但是反过来考虑反串,......
  • ABC 363 F - Palindromic Expression 题解
    下文中提到的数字都不包含0,注意把含0的数字特判掉。反转指各个数位倒过来,比如114514反转过后就是415411。注意到,答案一定是这样:数列\(a\)的各个数字相乘,乘以一个回文,再把数列\(a\)倒过来,每个数反转,再相乘。比如:2*57*184481*75*2,其中的数列\(a\)就是:257,中间的回文......
  • 题解:CodeForces 835 D Palindromic characteristics[区间dp/马拉车Manacher]
    CodeForces835DD.Palindromiccharacteristicstimelimitpertest:3secondsmemorylimitpertest:256megabytes*inputstandardinputoutputstandardoutputPalindromiccharacteristicsofstring\(s\)withlength\(|s|\)isasequenceof\(|s|\)in......
  • D2. Sum over all Substrings (Hard Version)
    原题链接题解code#include<bits/stdc++.h>#definelllonglongusingnamespacestd;lldp[1000005]={0};voidsolve(){lln,ans=0;cin>>n;strings;cin>>s;s=""+s;//使字符串1索引化for(lli=1......
  • 题解:P10732 [NOISG2019 Prelim] Palindromic FizzBuzz
    题解:P10732[NOISG2019Prelim]PalindromicFizzBuzz题意题意十分明了,给予你一个区间,判断区间中每一个数是否是回文数。思路思路比较简单,首先将每一个数按每一位放入一个数组中,顺序无论由前到后和由后到前都可以。接下来将数组折半循环,判断前后是否一样。一样的话是回文数,......
  • Leetcode 1143. Longest Common Subsequence
    ProblemGiventwostringstext1andtext2,returnthelengthoftheirlongestcommonsubsequence.Ifthereisnocommonsubsequence,return0.Asubsequenceofastringisanewstringgeneratedfromtheoriginalstringwithsomecharacters(canbenone......