📜  门| GATE CS 2021 |设置 2 |问题 11(1)

📅  最后修改于: 2023-12-03 15:28:39.114000             🧑  作者: Mango

门| GATE CS 2021 |设置 2 |问题 11

本题是2021年GATE计算机科学入门考试(SET2)的第11个问题。

题目描述

给定一个字符串S,找出其中最长的回文子字符串。例如,如果S为“forgeeksskeegfor”,则输出是“geeksskeeg”。

注意,此问题与寻找最长回文子序列的问题不同。例如,在字符串“character”中,最长回文子序列是“carac”,而最长回文子字符串是“ara”。

输入格式

输入是一个字符串S,长度为n(1≤n≤1000)。

输出格式

输出最长回文子字符串。

示例

输入:

forgeeksskeegfor

输出:

geeksskeeg
解题思路
暴力解法

暴力解法是最简单的方法之一,它的时间复杂度为 O(n³)。对于每个子字符串,都检查其是否是回文。最长回文子字符串将是具有最大长度的所有回文子字符串之一。实际上,可以在编写代码时忽略长度小于当前已找到的最大子串长度的所有子串,从而显着降低运行时间。

def is_palindrome(s):
    return s == s[::-1]

def longest_palindrome(s):
    max_len = 0
    result = ''

    for i in range(len(s)):
        for j in range(i,len(s)):
            curr_sub = s[i:j+1]
            if is_palindrome(curr_sub) and len(curr_sub)>max_len:
                max_len = len(curr_sub)
                result = curr_sub
                
    return result
中心扩展算法

中心扩展算法的时间复杂度为O(n²)。其基本思想是以一个字符或两个相邻字符为中心,并向两边扩展,以找到最长回文子字符串。有两种情况:中心是单字符,中心是双字符(例如,“abba”)。

def expand_around_center(s, c1, c2):
    l = c1
    r = c2
    while l >= 0 and r < len(s) and s[l] == s[r]:
        l -= 1
        r += 1
    return s[l+1:r]

def longest_palindrome(s):
    n = len(s)
    if n == 0:
        return ''
    max_len = 1
    result = s[0]
    
    for i in range(n-1):
        start = i
        end = i+1
        curr = ''
        
        while start >= 0 and end < n and s[start] == s[end]:
            curr = s[start:end+1]
            if len(curr) > max_len:
                max_len = len(curr)
                result = curr
            start -= 1
            end += 1
            
        curr = expand_around_center(s, i, i)
        if len(curr) > max_len:
            max_len = len(curr)
            result = curr
            
    return result
总结

本题的解法有多种,每种解法都有其优缺点。暴力解法简单快速,但时间复杂度高。中心扩展算法也很简单,但可能会产生很多子字符串,因此它可能是O(n²)时间复杂度中的一个瓶颈。在实际应用中,可能需要根据输入数据等因素选择不同的解法。