📜  门| GATE-CS-2004 |第 86 题(1)

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

题目

门| GATE-CS-2004 |第 86 题

题目描述

给定一个由字符'0'和'1'组成的字符串s,现在在该字符串中进行一些操作,操作步骤如下:

  1. 在字符串s中找到最长的子串,使得这个子串是回文的
  2. 将这个子串中的每一个'0'变成'1',每一个'1'变成'0'
  3. 返回操作后的字符串s

例如,字符串‘11011’可以进行操作,得到结果字符串‘00100’。

输入格式

  • 字符串s,由'0'和'1'组成,长度不超过1000

输出格式

  • 返回操作后的字符串s

示例

输入: s = '11011'

输出: '00100'

思路

  • 反转字符串,得到s_reverse
  • 求s和s_reverse的最长公共子串,即得到最长回文子串
  • 对于这个最长回文子串中的每一个字符,按照'0'和'1'进行替换
  • 将替换后的字符串再反转回来,得到最终结果

代码片段

def find_longest_palindrome(s):
    s_reverse = s[::-1]
    m, n = len(s), len(s_reverse)
    max_len = 0
    end = 0
    dp = [[0]*(n+1) for _ in range(m+1)]
    for i in range(1, m+1):
        for j in range(1, n+1):
            if s[i-1] == s_reverse[j-1]:
                dp[i][j] = dp[i-1][j-1] + 1
                if dp[i][j] > max_len:
                    max_len = dp[i][j]
                    end = i - 1
            else:
                dp[i][j] = 0
    return s[end-max_len+1:end+1]
    
def reverse(s):
    return s[::-1]

def replace_0_1(s):
    new_s = ''
    for i in range(len(s)):
        if s[i] == '0':
            new_s += '1'
        else:
            new_s += '0'
    return new_s

def find_replaced_palindrome(s):
    longest_palindrome = find_longest_palindrome(s)
    replaced_palindrome = replace_0_1(longest_palindrome)
    reversed_replaced_palindrome = reverse(replaced_palindrome)
    n = len(s)
    for i in range(n):
        if s[i:i+len(longest_palindrome)] == longest_palindrome:
            return s[:i] + reversed_replaced_palindrome + s[i+len(longest_palindrome):]
        i += 1
        
s = '11011'
print(find_replaced_palindrome(s)) # '00100'