给定 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"。
提示:
1 <= s.length, t.length <= 200
s 和 t 只含有小写字母以及字符 '#'
进阶:
你可以用 O(n) 的时间复杂度和 O(1) 的空间复杂度解决该问题吗?
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/backspace-string-compare
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
两种方法,一是栈,二是双指针。
栈:
class Solution { public boolean backspaceCompare(String s, String t) { Deque<Character> deQue1 = new LinkedList<>(); Deque<Character> deQue2 = new LinkedList<>(); for (char c : s.toCharArray()) { // 遇到#后栈顶出栈 if (c == '#') { // 避免开头就是#时出现空指针异常 if (!deQue1.isEmpty()) { deQue1.pop(); } // 入栈 } else { deQue1.push(c); } } for (char c : t.toCharArray()) { if (c == '#') { if (!deQue2.isEmpty()) { deQue2.pop(); } } else { deQue2.push(c); } } while (!deQue1.isEmpty() || !deQue2.isEmpty()) { // 有一方已经空了,但另一个还有字符,意味着两者不相等 if (deQue1.isEmpty() || deQue2.isEmpty()) { return false; // 栈顶元素不同 } else if (deQue1.pop() != deQue2.pop()) { return false; } } return true; } }
class Solution { // 有效元素:需要进行比较的元素。 // 无效元素:#以及需要被退格的元素。 public boolean backspaceCompare(String s, String t) { // 指针 int p1 = s.length() - 1; int p2 = t.length() - 1; // 计数器 int sum1 = 0; int sum2 = 0; while (p1 >= 0 || p2 >= 0) { // 计数器归零 sum1 = 0; sum2 = 0; // 避免空指针异常 while (p1 >= 0) { if (s.charAt(p1) == '#') { sum1 ++; } else { sum1 --; // 计数器小于零,说明当前元素时有效元素 if (sum1 < 0) { break; } } p1 --; } while (p2 >= 0) { if (t.charAt(p2) == '#') { sum2 ++; } else { sum2 --; if (sum2 < 0) { break; } } p2 --; } // 避免空指针异常,并且保证剩余字串为空串的情况。 if (p1 >= 0 && p2 >= 0) { // 对应位置不等,直接返回false即可。 if (s.charAt(p1) != t.charAt(p2)) { return false; } // p1 != p2,即有一方为-1,有一方大于等于0,此时直接返回false即可。 } else if (p1 != p2) { return false; } p1 --; p2 --; } return true; } }
标签:p2,844,false,---,p1,deQue2,return,deQue1,退格 From: https://www.cnblogs.com/allWu/p/17204124.html