题目
给你一个字符串 s,它由小写英文字母和特殊字符:*、# 和 % 组成。
请根据以下规则从左到右处理 s 中的字符,构造一个新的字符串 result:
- 如果字符是小写英文字母,则将其添加到
result中 - 字符
*会删除result中的最后一个字符(如果存在) - 字符
#会复制当前的result并追加到其自身后面 - 字符
%会反转当前的result
思路
这是一道典型的模拟题,需要按照题目给定的规则逐步处理字符串中的每个字符。
解题步骤:
- 初始化一个空的结果字符串
result - 从左到右遍历输入字符串
s的每个字符:- 如果是小写字母:直接添加到
result末尾 - 如果是
*:删除result的最后一个字符(需要检查是否为空) - 如果是
#:将result复制并追加到自身后面 - 如果是
%:反转result
- 如果是小写字母:直接添加到
- 返回最终的
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万+

被折叠的 条评论
为什么被折叠?



