二分查找你学废了吗?快来看看这道题如何使用二分查找解决吧!
LeetCode链接:844. 比较含退格的字符串
1.题目描述
给定 s
和 t
两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true
。#
代表退格字符。
注意:如果对空文本输入退格字符,文本继续为空。
示例 1:
1 2 3
| 输入:s = "ab#c", t = "ad#c" 输出:true 解释:s 和 t 都会变成 "ac"。
|
示例 2:
1 2 3
| 输入:s = "ab##", t = "c#d#" 输出:true 解释:s 和 t 都会变成 ""。
|
示例 3:
1 2 3
| 输入:s = "a#c", t = "b" 输出:false 解释:s 会变成 "c",但 t 仍然是 "b"。
|
提示:
1 <= s.length, t.length <= 200
s
和 t
只含有小写字母以及字符 '#'
进阶:
- 你可以用
O(n)
的时间复杂度和 O(1)
的空间复杂度解决该问题吗?
2.题解
2.1 暴力解法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| class Solution { public boolean backspaceCompare(String s, String t) { return getTrueString(s).equals(getTrueString(t)); }
public String getTrueString(String s) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < s.length(); i++) { char ch = s.charAt(i); if (ch != '#') { sb.append(ch); } else { if (sb.length() > 0) { sb.deleteCharAt(sb.length() - 1); } } } return sb.toString(); } }
|
2.2 双指针
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| 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) {
while (i >= 0) { if (s.charAt(i) == '#') { skipS++; i--; } else if (skipS > 0) { skipS--; i--; } else { break; } }
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 false; } } else { if (i >= 0 || j >= 0) { return false; } }
i--; j--; }
return true; } }
|