本文主要是介绍双指针法02,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
844. 比较含退格的字符串
给定 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)
的空间复杂度解决该问题吗?
遇到这道题,我第一反应是利用栈,顺序进栈而后遇到'#'则出栈,以下则用StringBuilder实现进栈与出栈的过程
class Solution {public boolean backspaceCompare(String s, String t) {return getResult(s).equals(getResult(t));}public String getResult(String res) {StringBuilder sb = new StringBuilder();for (int i = 0; i < res.length(); i++){if(res.charAt(i) != '#') {sb.append(res.charAt(i)); // 进栈}else {if(sb.length() > 0) {sb.deleteCharAt(sb.length() - 1); // 出栈}}}return sb.toString();}
}
这里利用StringBuilder的append 和 deleteCharAt 方法实现了元素的进栈和出栈。但我们细细思考(看过题解) 会发现其实还有其他解法,双指针就是一个效率很高的解法。
class Solution {public boolean backspaceCompare(String s, String t) {int i = s.length() - 1 , 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;}}// **********************************************************// 这里从后往前依次比较,对应位置字符不同则返回falseif(i >= 0 && j >= 0) {if (s.charAt(i) != t.charAt(j)) {return false;}}else { // 这里则是为了避免ca#abc 和 abc 可能返回true的错误if(i >= 0 || j >= 0) {return false;}}i--;j--;}return true;}
}
这篇关于双指针法02的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!