来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/backspace-string-compare
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
844.给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果。 # 代表退格字符。注意:如果对空文本输入退格字符,文本继续为空。
- 拿到题目时并不清楚如何用简单的方法处理退格,既需要删去#号,又需要再往前再删一个元素。查看题解使用的第一种方法是使用栈去对字符串进行重构,然后再进行比较。重构的过程是这样的:遇到不是#号的元素就入栈,遇到#号就弹出栈顶元素。
char* rebuild(char *str){
int oldLen = strlen(str), newLen = 0;//newLen相当于栈顶指针
//存储新字符串的栈
char *newStr = (char*)malloc(sizeof(char) * (oldLen + 1));
for (int i = 0; i < oldLen; i ++) {
if (str[i] != '#')
//入栈一个元素
newStr[newLen ++] = str[i];
else if (newLen > 0)
//相当于把栈顶元素出栈
newLen --;
}
newStr[newLen] = '\0';
return newStr;
}
bool backspaceCompare(char * s, char * t){
return strcmp(rebuild(s),rebuild(t)) == 0;
}
- 第二种解法是双指针法,跟之前使用的双指针法不太一样。由于#号只对左边的字符有影响,所以用两个指针分别指向两个字符串的末尾,逆向遍历,并且记录下遇到的#号个数,当遇到某个字符时且遇到#号的数量为0时,说明该字符会留下来,对留下来的字符一一进行比对,如果都能比对成功的话就说明退格后的字符串是一样的。
bool backspaceCompare(char* S, char* T) {
//分别指向两个字符串末尾
int i = strlen(S) - 1, j = strlen(T) - 1;
//用于记录两个字符串中遇到的#号个数
int skipS = 0, skipT = 0;
while (i >= 0 || j >= 0) {
while (i >= 0) {
if (S[i] == '#') { //记录加1,指针前移
skipS++, i--;
} else if (skipS > 0) { //记录减1,指针前移
skipS--, i--;
} else { //当前字符不为#号时且记录数为0时遍历要停止
break;
}
}
while (j >= 0) {
if (T[j] == '#') { //记录加1,指针前移
skipT++, j--;
} else if (skipT > 0) { //记录减1,指针前移
skipT--, j--;
} else { //当前字符不为#号时且记录数为0时遍历要停止
break;
}
}
if (i >= 0 && j >= 0) { //当两个指针都不小于0时才需要进行比对字符
if (S[i] != T[j]) {
return false;
}
} else {
if (i >= 0 || j >= 0) {
return false;
}
}
i--, j--;
}
return true;
}