给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true 。# 代表退格字符。
注意:如果对空文本输入退格字符,文本继续为空。
示例 1:
输入:s = "ab#c", t = "ad#c"
输出:true
解释:s 和 t 都会变成 "ac"。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/backspace-string-compare
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解、因为#是删除之前的元素,若从左至右比较#的作用未比上,从右至左比较可实现#功能后的字符比较。
1、当前字符是否为#
2、若当前字符不为#,之前是否有#
3、若有#,则#记数--,若无#,则比较当前字符
题解一、两个字符串同时比较,最大时间复杂度为O(m + n)。
- class Solution {
- public boolean backspaceCompare(String s, String t) {
- int i = s.length() - 1, j = t.length() - 1;
- int sk1 = 0, sk2 = 0;
- while (i >= 0 || j >= 0) {
- while (i >= 0) {
- if (s.charAt(i) == '#') {
- sk1++;
- i--;
- } else if (sk1 != 0) {
- sk1--;
- i--;
- } else {
- break;
- }
- }
- while (j >= 0) {
- if (t.charAt(j) == '#') {
- sk2++;
- j--;
- } else if (sk2 != 0) {
- sk2--;
- 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;
- }
- i--;
- j--;
-
- }
- return true;
- }
- }
题解二、抽出一个方法,进行退格后字符串的反向拼接,在进行对比。
- class Solution {
- public boolean backspaceCompare(String s, String t) {
- return convert(s).equals(convert(t));
- }
-
- public String convert(String s) {
- StringBuilder sb = new StringBuilder();
- int sk = 0;
- for(int i = s.length() - 1; i >= 0; i--) {
- if (s.charAt(i) == '#') {
- sk++;
- } else if (sk != 0) {
- sk--;
- } else {
- sb.append(s.charAt(i));
- }
- }
- return sb.toString();
- }
- }