LeetCode 1417. 重新格式化字符串

1417. 重新格式化字符串

题目:给你一个混合了数字和字母的字符串 s,其中的字母均为小写英文字母。
请你将该字符串重新格式化,使得任意两个相邻字符的类型都不同。也就是说,字母后面应该跟着数字,而数字后面应该跟着字母。
请你返回 重新格式化后 的字符串;如果无法按要求重新格式化,则返回一个 空字符串 。
链接 https://leetcode.cn/problems/reformat-the-string/

个人思路
  1. 先把字符串s中的字母和数字分别储存在列表salpha和snum中,然后比较两个列表长度是否相差1或者相等,否则返回空字符,若满足则按列表直接加起来
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

官方思路
  1. 双指针
    自己也想到用双指针,但代码写起来不是很清晰,所以没用
    在这里插入图片描述
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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值