构造回文字符串问题 | 豆包MarsCode AI刷题

124 阅读3分钟

构造回文字符串问题

小C手中有一个由小写字母组成的字符串 s。她希望构造另一个字符串 t,并且这个字符串需要满足以下几个条件:

  1. t 由小写字母组成,且长度与 s 相同。
  2. t 是回文字符串,即从左到右与从右到左读取相同。
  3. t 的字典序要小于 s,并且在所有符合条件的字符串中字典序尽可能大。

小C想知道是否能构造出这样的字符串 t,输出这样的t。如果无法构造满足条件的字符串,则输出 -1


测试样例

样例1:

输入:s = "abc" 输出:'aba'

样例2:

输入:s = "cba" 输出:'cac'

样例3:

输入:s = "aaa" 输出:'-1'

解题思路

这道题要求构造一个回文字符串,并且满足字典序小于 s 且尽可能大。以下是解决思路:

  1. 构造回文字符串

    1. 回文字符串要求从左到右和从右到左读取一致,因此可以通过将 s 的左半部分映射到右半部分来构造一个初步的回文字符串 t
  2. 字典序的判断

    1. 将初步构造的回文字符串 ts 比较。
    2. 如果 t < s,则 t 满足条件,可以直接返回。
    3. 如果 t >= s,说明 t 不符合条件,需要进一步调整 t 使其小于 s
  3. 调整字符串使字典序最大化

    1. t >= s,可以调整 t 的中间字符(若长度为奇数)或中间两个字符(若长度为偶数),让 t 尽量小于 s

字符串的字典序比较

在 Python 中,字符串的字典序比较可以直接使用 <, <=, >, >= 运算符进行。这些运算符会从字符串的第一个字符开始逐一比较,直到找到第一个不同的字符为止。如果所有字符相同但长度不同,则较短的字符串字典序更小。

  • print("abc" < "abd") # True,因为 "c" < "d"
  • print("abc" < "abcd") # True,因为 "abc" 比 "abcd" 短

特殊情况

  1. s 全部由字母 a 组成:如 "aaa",此时无法构造符合条件的字符串 t,直接返回 -1
  2. 长度为 1 的字符串:例如 s = "a",因为没有比单个字符 a 更小的回文字符串,因此返回 -1

def solution(s2: str) -> str:
    s=s2
    s=list(s)
    n=len(s)
    i,j=0,n-1
    b=0
    half=int(n/2)
    while(i<half):
        s[j]=s[i]
        i+=1
        j-=1
    s="".join(s)
    if(s<s2):return s
    elif(s==s2 and s[0]=="a"):return "-1"
    else :
        if(n%2==1):
            s=list(s)
            if(s[half]=="a"):
                s[half]="z"
                s[half-1]= chr(ord(s[half-1])-1)
                s[half+1]= s[half-1]
            else:s[half]= chr(ord(s[half])-1)
            s="".join(s)
            return s
        else:
            s=list(s)
            if(s2[half]<s2[half-1]):
                print(s2[half-1])
                s[half-1]=  chr(ord(s2[half-1])-1)
            elif (s2[half]==s2[half-1]):
                s[half-1]=  chr(ord(s2[half-1])-1)
            print(s[half-1])
            s[half]=s[half-1]
            s="".join(s)
            return s
    

if __name__ == '__main__':
    # 测试用例
    print(solution("abc"))  # 输出: 'aba'
    print(solution("cba"))  # 输出: 'cac'
    print(solution("aaa"))  # 输出: '-1'
    print(solution("aaabbbbcaaaccaba"))  # 输出: '-1'