给定 s
和 t
两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true
。#
代表退格字符。
注意:如果对空文本输入退格字符,文本继续为空。
示例 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 = "b" 输出:false 解释:s 会变成 "c",但 t 仍然是 "b"。
【看完题解之后我的疑惑:也没有把字符串删除啊】
【然后反应过来,s和t的比较是同步进行的,并不用移除,同一下标下的字符相等即可】
【本题的解法是在记录偏移量】
【为什么选择从后往前遍历呢?因为 # 号只会消除左边的一个字符,所以对右边的字符无影响,所以我们选择从后往前遍历s、t字符串】
class Solution { public boolean backspaceCompare(String s, String t) { int i = s.length() - 1; int j = t.length() - 1; int skipS = 0, skipT = 0; while (i >= 0 || j >= 0) { // s循环 // i 从最后一个元素开始,如果此指针指向的元素为“#“,那么skipS的值加一,再接着判断skipS的值是否大于0; //如果大于零,则要消灭”#“,那么就skipS--,并且i--;通过循环回退同等数量的字符 while (i >= 0) { if (s.charAt(i) == '#'){ skipS++; i--; //此i--是从'#'字符指向下一个 } else if (skipS > 0) { skipS--; i--; //此i--是因为skipS > 0 ;执行回退操作 }else { break; //当此位置上的字符不是” # ”且skipS为0(即并没有扫描到#还),直接跳出此循环 } } //T循环 while (j >= 0) { if (t.charAt(j) == '#') { skipT++; j--; }else if (skipT > 0){ skipT--; j--; }else { break; } } // if (i >= 0 && j >= 0){ // if (s.charAt(i) == t.charAt(j)){ // return true; // } // } else { // return false; // } //为什么这个逻辑就是对的,换成相等的就是不对啊 if (i >= 0 && j >= 0) { if (s.charAt(i) != t.charAt(j)){ return false; } } else { if (i>= 0 || j>= 0) { return false; } } i--; j--; } return true; } }
【再问(改进版)】
if (i >= 0 && j >= 0){ if (s.charAt(i) != t.charAt(j)){ return false; } //?? 加上下面这些逻辑不是一样的吗 为什么加上了就是不对啊 // } else { // return true; // } } else { if (i>= 0 || j>= 0) { return false; } } //为什么这个逻辑就是对的,换成相等的就是不对啊 // if (i >= 0 && j >= 0) { // if (s.charAt(i) != t.charAt(j)){ // return false; // } // } else { // if (i>= 0 || j>= 0) { // return false; // } // }
标签:844,return,charAt,--,else,skipS,false,退格 From: https://www.cnblogs.com/18191xq/p/17832039.html