题目:给你一个混合了数字和字母的字符串 s,其中的字母均为小写英文字母。
请你将该字符串重新格式化,使得任意两个相邻字符的类型都不同。也就是说,字母后面应该跟着数字,而数字后面应该跟着字母。
请你返回 重新格式化后 的字符串;如果无法按要求重新格式化,则返回一个 空字符串 。
链接 https://leetcode.cn/problems/reformat-the-string/
class Solution:
def reformat(self, s: str) -> str:
if len(s) == 1:
return s
snum = []
salpha = []
for i in s:
if i.isdigit():
snum.append(i)
else:
salpha.append(i)
res = ''
if abs(len(snum)-len(salpha)) > 1:
return res
if len(snum) > len(salpha):
for i in range(len(salpha)):
res += snum[i] + salpha[i]
return res+snum[-1]
elif len(snum) < len(salpha):
for i in range(len(snum)):
res += salpha[i] + snum[i]
return res+salpha[-1]
else:
for i in range(len(salpha)):
res += snum[i] + salpha[i]
return res
class Solution:
def reformat(self, s: str) -> str:
sumDigit = sum(c.isdigit() for c in s)
sumAlpha = len(s) - sumDigit
if abs(sumDigit - sumAlpha) > 1:
return ""
flag = sumDigit > sumAlpha
t = list(s)
j = 1
for i in range(0, len(t), 2):
if t[i].isdigit() != flag:
while t[j].isdigit() != flag:
j += 2
t[i], t[j] = t[j], t[i]
return ''.join(t)
但对于官方给出的这段代码看不是很明白,所以自己改写成了下面:
class Solution:
def reformat(self, s: str) -> str:
if len(s) == 1:
return s
sumDigit = sum(c.isdigit() for c in s)
sumAlpha = len(s) - sumDigit
if abs(sumDigit - sumAlpha) > 1:
return ""
i,j = 0,1 # 分别记录数字和字母加到的位置
slist = [0]*len(s)
# 将数字和字母分别加到对应的位置
if sumDigit > sumAlpha:
for k in s:
if k.isdigit():
slist[i] = k
i += 2
else:
slist[j] = k
j += 2
else:
for k in s:
if k.isdigit():
slist[j] = k
j += 2
else:
slist[i] = k
i += 2
return ''.join(slist)
复杂度分析
时间复杂度:O(n),其中 n 为字符串 s 的长度,需要遍历两遍字符串。
空间复杂度:对于字符串可变的语言为 O(1),仅使用常量空间。而对于字符串不可变的语言需要新建一个和 s 等长的字符串,所以空间复杂度是 O(n)。
作者:LeetCode-Solution
链接:https://leetcode.cn/problems/reformat-the-string/solution/zhong-xin-ge-shi-hua-zi-fu-chuan-by-leet-lgqx/