题目描述:
给定 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 只含有小写字母以及字符 ‘#’。
一开始拿到题目也是有待蒙蔽,但是思考了两分钟就直接撸出代码了
class Solution {
public boolean backspaceCompare(String S, String T) {
StringBuilder Ssb = new StringBuilder();
StringBuilder Tsb = new StringBuilder();
for (int i = 0; i < S.length(); i++) {
if(S.charAt(i) == '#'){
if(Ssb.length() != 0){
Ssb.delete(Ssb.length() - 1, Ssb.length());
}
}else {
Ssb.append(S.charAt(i));
}
}
for (int i = 0; i < T.length(); i++) {
if(T.charAt(i) == '#'){
if(Tsb.length() != 0){
Tsb.delete(Tsb.length() - 1, Tsb.length() );
}
}else {
Tsb.append(T.charAt(i));
}
}
System.out.println(Tsb.toString());
System.out.println(Ssb.toString());
if(new String(Tsb).equals(new String(Ssb))){
return true;
}else {
return false;
}
}
}
排名靠前的代码
感觉思路差不多啊,但是这个是从后往前,这样可以大大减少了比较的次数,因为如果后面的都不一样,那么肯定不一样,因此可以直接进行判断
class Solution {
public boolean backspaceCompare(String S, String T) {
if ((null == S && null != T) || (null != S && null == T)) {
return false;
}
for (int i = S.length() - 1, j = T.length() - 1; ; --i, --j) {
for (int b = 0; i >= 0 && (b > 0 || '#' == S.charAt(i)); --i) {
b += '#' == S.charAt(i) ? 1 : -1;
}
for (int b = 0; j >= 0 && (b > 0 || '#' == T.charAt(j)); --j) {
b += '#' == T.charAt(j) ? 1 : -1;
}
if (0 > i || 0 > j || S.charAt(i) != T.charAt(j)) {
return -1 == i && -1 == j;
}
}
}
}
自己尝试写一下,只写了一个大概,其余没写出来,回头有时间再补
Stack<Character> Stem = new Stack<>();
Stack<Character> Ttem = new Stack<>();
int indexS = S.length() - 1;
int indexT = T.length() - 1;
for (int i = S.length() - 1; i >= 0; i--) {
if(S.charAt(i) == '#'){
Stem.push(S.charAt(i));
}else {
if(!Stem.isEmpty() && Stem.peek() == '#'){
Stem.pop();
}else {
Stem.push(S.charAt(i));
}
}
}