【Leetcode】Q1. 用特殊操作处理字符串 I

题目

题目链接🔗

给你一个字符串 s,它由小写英文字母和特殊字符:*#% 组成。

请根据以下规则从左到右处理 s 中的字符,构造一个新的字符串 result

  • 如果字符是小写英文字母,则将其添加到 result
  • 字符 *删除 result 中的最后一个字符(如果存在)
  • 字符 #复制当前的 result追加到其自身后面
  • 字符 %反转当前的 result

思路

这是一道典型的模拟题,需要按照题目给定的规则逐步处理字符串中的每个字符。

解题步骤:

  1. 初始化一个空的结果字符串 result
  2. 从左到右遍历输入字符串 s 的每个字符:
    • 如果是小写字母:直接添加到 result 末尾
    • 如果是 *:删除 result 的最后一个字符(需要检查是否为空)
    • 如果是 #:将 result 复制并追加到自身后面
    • 如果是 %:反转 result
  3. 返回最终的 result

关键点:

  • 在执行 * 操作时,需要检查结果字符串是否为空
  • 严格按照从左到右的顺序处理每个字符
  • 每个操作都是在当前 result 的基础上进行的

代码

class Solution {
public:
    string processStr(string s) {
        string result = "";
        
        for (char c : s) {
            if (c >= 'a' && c <= 'z') {
                // 小写字母,直接添加
                result += c;
            } else if (c == '*') {
                // 删除最后一个字符
                if (!result.empty()) {
                    result.pop_back();
                }
            } else if (c == '#') {
                // 复制当前字符串并追加
                result += result;
            } else if (c == '%') {
                // 反转当前字符串
                reverse(result.begin(), result.end());
            }
        }
        
        return result;
    }
};
class Solution {
    public String processStr(String s) {
        StringBuilder result = new StringBuilder();
        
        for (char c : s.toCharArray()) {
            if (c >= 'a' && c <= 'z') {
                // 小写字母,直接添加
                result.append(c);
            } else if (c == '*') {
                // 删除最后一个字符
                if (result.length() > 0) {
                    result.deleteCharAt(result.length() - 1);
                }
            } else if (c == '#') {
                // 复制当前字符串并追加
                result.append(result.toString());
            } else if (c == '%') {
                // 反转当前字符串
                result.reverse();
            }
        }
        
        return result.toString();
    }
}
class Solution:
    def processStr(self, s: str) -> str:
        result = []
        
        for c in s:
            if c.islower():
                # 小写字母,直接添加
                result.append(c)
            elif c == '*':
                # 删除最后一个字符
                if result:
                    result.pop()
            elif c == '#':
                # 复制当前字符串并追加
                result.extend(result[:])
            elif c == '%':
                # 反转当前字符串
                result.reverse()
        
        return ''.join(result)

复杂度分析

时间复杂度

O(n × m),其中 n 是输入字符串 s 的长度,m 是结果字符串的平均长度:

  • 遍历字符串需要 O(n) 时间
  • 每次 # 操作会使字符串长度翻倍,可能导致字符串变长
  • 每次 % 操作需要 O(m) 时间来反转字符串

空间复杂度

O(m),其中 m 是最终结果字符串的长度,用于存储结果字符串。

结果

  • 通过所有测试用例
  • 执行用时:2 ms
  • 内存消耗:较少

总结

这道题是一道标准的模拟题,考查的是:

  1. 字符串基本操作:拼接、删除、反转
  2. 条件判断:根据不同字符执行不同操作
  3. 边界处理:处理空字符串的情况

解题要点:

  • 严格按照题目要求的顺序处理每个字符
  • 注意 * 操作时需要检查字符串是否为空
  • 理解 # 操作是将当前字符串复制并追加到自身后面
  • % 操作是完全反转当前字符串

总体而言,这是一道难度适中的模拟题,重点在于理解题意和正确实现各种字符串操作。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

想要AC的dly

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值