比较含退格的字符串
1.问题描述
给定 S
和 T
两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果。 #
代表退格字符。
注意:如果对空文本输入退格字符,文本继续为空。
示例 1:
输入:S = "ab#c", T = "ad#c"
输出:true
解释:S 和 T 都会变成 “ac”。
示例 2:
输入:S = "ab##", T = "c#d#"
输出:true
解释:S 和 T 都会变成 “”。
示例 3:
输入:S = "a##c", T = "#a#c"
输出:true
解释:S 和 T 都会变成 “c”。
示例 4:
输入:S = "a#c", T = "b"
输出:false
解释:S 会变成 “c”,但 T 仍然是 “b”。
提示:
1 <= S.length <= 200
1 <= T.length <= 200
S
和T
只含有小写字母以及字符'#'
。
进阶:
- 你可以用
O(N)
的时间复杂度和O(1)
的空间复杂度解决该问题吗?
2.求解
重构字符串
代码如下
/*
* 执行用时:1 ms, 在所有 Java 提交中击败了96.52% 的用户
* 内存消耗:36.2 MB, 在所有 Java 提交中击败了99.88% 的用户
* */
public boolean backspaceCompare(String S, String T) {
return getBackString(S).equals(getBackString(T));
}
private String getBackString(String s) {
char[] chars = s.toCharArray();
StringBuilder s1 = new StringBuilder();
for (int i = 0, j = 0; i < chars.length; i++) {
if (chars[i] != '#') {
s1.append(chars[i]);
} else {
if (s1.length() > 0) {
s1.deleteCharAt(s1.length() - 1);
}
}
}
return s1.toString();
}
- 空间复杂度、时间复杂度均为O(N)
栈
代码如下
/*
*执行用时:2 ms, 在所有 Java 提交中击败了74.87% 的用户
* 内存消耗:36.4 MB, 在所有 Java 提交中击败了99.59% 的用户
* */
public boolean backspaceCompare(String S, String T) {
return getBackString(S).equals(getBackString(T));
}
private LinkedList getBackString(String s) {
LinkedList l1 = new LinkedList();
char[] chars = s.toCharArray();
for (int i = 0, j = 0; i < chars.length; i++) {
if (chars[i] != '#') {
l1.push(chars[i]);
} else {
if (l1.size() > 0) {
l1.pop();
}
}
}
return l1;
}
双指针
- 分别倒序遍历两个数组,遇见字母则比较,遇见"#"则跳过,并且继续跳过前面的一个字符
- 若字母不一致直接返回false,若比较到最后说明两字符串相同返回true
- 当一方字符串遍历完成,另一方还有剩余时,说明不同,返回false
代码如下
/*
*执行用时:0 ms, 在所有 Java 提交中击败了100.00% 的用户
* 内存消耗:36.6 MB, 在所有 Java 提交中击败了97.55% 的用户
* */
public boolean backspaceCompare(String S, String T) {
int backS = 0, backT = 0;
int i = S.length() - 1, j = T.length() - 1;
while (i >= 0 || j >= 0) {
while (i >= 0) {
if (S.charAt(i) == '#') {
backS++;
i--;
} else if (backS > 0) {
backS--;
i--;
} else {
break;
}
}
while (j >= 0) {
if (T.charAt(j) == '#') {
backT++;
j--;
} else if (backT > 0) {
backT--;
j--;
} else {
break;
}
}
if (i >= 0 && j >= 0) {
if (S.charAt(i) != T.charAt(j)) {
return false;
}
} else {
if (i >= 0 || j >= 0) {
return false;
}
}
j--;
i--;
}
return true;
}
- 时间、空间复杂度完成题目要求