LeetCode 1047. 整理字符串
一. 题目描述
二. 解题思路
这道题与之前的 LeetCode 1047删除字符串中的所有相邻重复项解法十分类似,都是利用数组模拟实现栈进行解题。
可以参考一下LeetCode 1047.删除字符串中的所有相邻重复项
主要思想就是将s中的元素从第一个开始,依次放入栈stack中(即遍历s),每一次比较栈顶元素是否与当前s的首元素互为大小写(即栈顶元素的ascll值±32是否等于当前s的首元素),如果相等,则他们互为大小写,此时只需将栈顶指针top向下移动一位即可,就相当于删去了刚才的元素,因为下一个s中的首元素入栈时,会覆盖掉原来的元素。
如果栈顶的元素和当前s的首元素不相等,只需要将当前s中的首元素入栈即可。
当栈为空时,即top = -1,因为没有要比较的元素,所以也只需要将当前s的首元素入栈即可。
当s中的元素都遍历完的时候,栈stack中的元素就是所求的结果。
最后返回时记得在stack的末尾加上’\0’,因为题目要求返回一个字符串。
三. ac代码
char * makeGood(char * s){
int s_len = strlen(s);
char* stack = (char*)malloc(sizeof(char) * (s_len + 1)); // 动态分配一个数组 长度为 s_len+1
int top = -1; // 栈初始为空
for (int i = 0; i < s_len; i ++ ) {
// 栈空
if (top == -1) {
stack[++top] = s[i];
}
// 栈不空
else {
// 栈顶元素 与 当前字符串首元素互为大小写
if (stack[top] + 32 == s[i] || stack[top] - 32 == s[i]) {
top --;
}
// 栈顶元素 与当前字符串首元素不相关
else {
stack[++top] = s[i];
}
}
}
// 在结果的末尾加上'\0' 表示字符串
stack[++top] = '\0';
return stack;
}
执行结果如下