• 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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    官方思路

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    但对于官方给出的这段代码看不是很明白,所以自己改写成了下面:

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    复杂度分析
    时间复杂度: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/

  • 相关阅读:
    JAVA_多线程的实现方式
    2023第十七届中国品牌节 | 每日互动刘宇分享大模型创新应用AITA智选人群工具
    软件外包开发设计文档的编写
    bootz 启动 kernel
    Python | 执行shell 命令的几种方法
    【HTML/CSS学习】margin和padding的区别
    去除upload的抖动效果
    计算机视觉 激光雷达结合无监督学习进行物体检测的工作原理
    基于java在线影院订票系统论文
    drools规则引擎并发结果不准确问题记录
  • 原文地址:https://blog.csdn.net/weixin_48127034/article/details/126285749