题目描述
给定 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) 的空间复杂度解决该问题吗?
一、思路
两种思路:使用出栈入栈来进行记录 和 使用双指针(慢指针用来记录新数组索引,快指针用来指向新数组值)
使用栈:
通过对字符串缓冲区内的数条件筛选(此处写法类似于下面那种双指针)进行增添和删除实现入栈和出栈操作,
双指针:写法分为从前到后和从后往前,第二种难于理解,这里我们使用从前往后进行遍历。
本来以为我已经学会使用双指针了,但是看到这道题又让我陷入懵逼了;业精于勤荒于嬉!
首先 慢指针用来记录一个新的数组索引的值,快指针用来确定新数组中的值,然后将是否退格符作为判断标准,如果是退格符的话,那么此时前一个符被清理掉,所以slow–将慢指针回退到上一个索引位置,然后重新去赋值。
二、参考代码
栈操作:
class Solution { public boolean backspaceCompare(String s, String t) { // 方式一:通过管理栈来做到对目标字符的提取 return build(s).equals(build(t)); } public String build(String str){ StringBuffer ret = new StringBuffer(); for(int i =0;i<str.length();i++){ char ch = str.charAt(i); if(ch != '#'){ // append() 可以把任意类型数据添加到字符串缓冲区 ret.append(ch); }else{ // 首字母为# 也是空需要排除 没意义 if(ret.length()>0){ // deleteCharAt() 方法用于移除序列中指定位置的字符 ret.deleteCharAt(ret.length()-1); } } } return ret.toString(); }
双指针:
class Solution { // 使用经典的双指针法 快慢指针, 快指针指向值,慢指针指向索引 public static String changeString(String str){ int slow = 0; char [] x= str.toCharArray(); for(int fast = 0;fast<x.length;fast++){ if(x[fast] != '#'){ x[slow++] = x[fast]; }else{ if(slow>0 ){ slow--; } } } // String.valueOf(char[] data, int offset, int count) : // 将 char 数组 转换成字符串 return String.valueOf(x,0,slow); } }