美团318笔试回文串
首先遍历一遍字符串,记录下不匹配的位置有几对(如果字符串为奇数长度,也记录下中间落单的那个位置),根据题目要求,这个数量应该为0,1,2。然后分情况讨论。如果不匹配位置为2对,那么这两对都把较大的改成较小的即可。如果不匹配位置为1时,有两种情况,第一种是其中有一个为a,另一个不是,此时将另一个不为a的改为a,且如果字符串长度为奇数,那么将中间落单的改为a。第二种是两个都不为a,那么将这两个都改为a即可。如果不匹配位置为0,说明本身就是回文串。此时再次遍历,找到第一对不为a的位置,将他们都改为a即可。如果每一对都为a,且还剩余修改次数,那么只能改中间落单的为a。想问问大家我这个思路有问题吗?
st = input() n = len(st) s = [0 for i in range(n)] for i in range(n): s[i] = st[i] #print(s) notsolve = [] left, right = 0, n-1 dif = 0 # 已修改次数 mid = -1 while left <= right: if left == right: mid = left break if s[left] != s[right]: notsolve.append((left, right)) left += 1 right -= 1 if len(notsolve) == 2: for i in range(2): tmp = notsolve[i] if ord(s[tmp[0]]) < ord(s[tmp[1]]): s[tmp[1]] = s[tmp[0]] else: s[tmp[0]] = s[tmp[1]] dif += 1 elif len(notsolve) == 1: tmp = notsolve[0] if s[tmp[0]] == 'a' or s[tmp[1]] == 'a': dif += 1 else: dif += 2 s[tmp[0]] = 'a' s[tmp[1]] = 'a' #print(s, dif) if dif == 0: left, right = 0, n-1 while left <= right: if left == right: break elif s[left] != 'a': s[left] = 'a' s[right] = 'a' dif += 2 break left += 1 right -= 1 if dif == 1: if mid != -1: s[mid] = 'a' sans = '' for i in range(n): sans += s[i] print(sans)
这个只能过27%,请问大家是哪里有问题呢?