目录
一,题目描述
英文描述
Given two strings s and t, return true if they are equal when both are typed into empty text editors. '#' means a backspace character.
Note that after backspacing an empty text, the text will continue empty.
中文描述
给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果。 # 代表退格字符。
注意:如果对空文本输入退格字符,文本继续为空。
示例与说明
示例 1:
示例 2:
示例 3:
示例 4:提示:
1 <= S.length <= 200
1 <= T.length <= 200
S 和 T 只含有小写字母以及字符 '#'。
进阶:
你可以用 O(N) 的时间复杂度和 O(1) 的空间复杂度解决该问题吗?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/backspace-string-compare
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二,解题思路
一看是简单题,就没想太多,直接按字符串拼接来处理了,但是字符串处理比较麻烦而且效率感人,参考了题解后恍然大悟。@Demigodliu【【双指针】比较含退格的字符串】
注意到一个规律:从右向左遍历字符串时不会受到#的影响,当遇到#时只需要记录其个数,然后跳过相应数目的字符即可。
每确定一次两字符串中指针的位置,进行一次字符比较即可。
三,AC代码
Java
class Solution {
public boolean backspaceCompare(String s, String t) {
int i = s.length() - 1, j = t.length() - 1;
int skipS = 0, skipT = 0;// 记录遍历过程中#的数量
// 这里采用|| 注意一种情况s="s", t="n#s" 即一个指针遍历到尽头 仍有可能两字符串相等
while (i >= 0 || j >= 0) {
while (i >= 0) {
if (s.charAt(i) == '#') skipS++;
else if (skipS == 0) break;
else skipS--;
i--;
}
while (j >= 0) {
if (t.charAt(j) == '#') skipT++;
else if (skipT == 0) break;
else skipT--;
j--;
}
if (i < 0 || j < 0) break;
if (s.charAt(i) != t.charAt(j)) return false;
i--;j--;// 当前字符比较完毕 指针再次前移
}
return (i < 0 && j < 0);// 两指针全部遍历结束后标明字符串相等
}
}
四,解题过程
第一博
字符串处理果然比较头疼。先用一种最容易想到的方法实现——直接拼接出最终字符串。
StringBuilder之间的比较不能直接用equals,需要先转换为String再用equals。
class Solution {
public boolean backspaceCompare(String s, String t) {
StringBuilder S = new StringBuilder(), T = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == '#') {
if (!S.toString().equals("")) {
S.delete(S.length() - 1, S.length());
}
}
else S.append(s.substring(i, i + 1));
}
for (int i = 0; i < t.length(); i++) {
if (t.charAt(i) == '#') {
if (!T.toString().equals("")) {
T.delete(T.length() - 1, T.length());
}
}
else T.append(t.substring(i, i + 1));
}
return S.toString().equals(T.toString());
}
}
第二搏
搜了下题解,学到了学到了