首页 > 编程语言 >力扣844(Java)-比较含退格的字符串(简单)

力扣844(Java)-比较含退格的字符串(简单)

时间:2023-04-23 11:35:55浏览次数:49  
标签:字符 844 Java String -- 复杂度 else sb 退格

题目:

给定 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

方法一:使用栈的思路

  • 当 当前字符不为 ‘#’时,将其弹入字符栈中;
  • 当当前字符为‘#’ 且字符栈不为空时,弹出字符栈的最后一个字符;
  • 最后将两个字符栈中的字符进行比较即可。

可以通过,但是复杂度不满足进阶题意

  • 时间复杂度:O(n + m)
  • 空间复杂度:O(n + m)
 1 class Solution {
 2     public boolean backspaceCompare(String s, String t) {
 3         return getString(s).equals(getString(t));
 4 
 5     }
 6     public String getString(String s){
 7         StringBuilder sb = new StringBuilder();
 8         for (char c : s.toCharArray()){
 9             if (c != '#'){
10                 sb.append(c);
11             }else if (sb.length() > 0){
12                 sb.deleteCharAt(sb.length() - 1);
13             }
14         }
15         return sb.toString();
16     }
17 }

方法二:双指针

两个指针i ,j 分别指向字符串s和t 的末尾,countT和countS来统计s 和t 中的 #的数量,从后往前遍历字符串处理过程如下:

  • 若当前字符为 # ,则Count值加1;
  • 若当前字符不为#且count值不为0,就该处理退格,count值就会减1,字符位置也会减1;
  • 以上两种情况的否定即当前字符不为#且count值为0,代表当前字符不会背回退,则用来和另一个字符串中的当前位置做比较;

若对比过程出现S和T 当前字符不匹配,则遍历结束,返回 false,若S,T 都遍历结束,且都能一一匹配,则返回true。

复杂度:

  • 时间复杂度:O(n + m)
  • 空间复杂度:O(1)
 1 class Solution {
 2     public boolean backspaceCompare(String s, String t) {
 3         int i = s.length() - 1, j = t.length() - 1;
 4         //统计字符串中#数量
 5         int countS = 0, countT = 0;
 6         while (i >= 0 || j >= 0){
 7             //处理s
 8             while (i >= 0){
 9                 if (s.charAt(i) == '#'){
10                     countS++;
11                     i--;
12                 }else if (countS > 0){
13                     //这时候就该抵消字符了
14                     countS--;
15                     i--;
16                 }else{
17                     break;
18                 }
19             }
20             //处理t
21             while (j >= 0){
22                 if (t.charAt(j) == '#'){
23                     countT++;
24                     j--;
25                 }else if (countT > 0){
26                     //这时候就该抵消字符了
27                    countT--;
28                    j--;
29                 }else{
30                     break;
31                 }
32             }
33             //两个小循环处理完毕以后,进入大循环判断
34             if (i >= 0 && j >= 0){
35                 if (s.charAt(i) != t.charAt(j)){
36                     return false;
37                 }
38             }else if (i >= 0 || j >= 0){
39                 // i>=0 且 j >= 0为false的情况
40                 // i < 0 且 j >= 0 : 
41                 // i >= 0 且 j < 0 :
42                 //以上两种不满足,其中有一个在还没有遍历完的时候就找到字符,另一个已经遍历完了不符合题意
43                 // i < 0 且 j < 0:在0位置找到了#,回退就变成了空字符,符合题意
44                 return false;
45             }
46             i--;
47             j--;
48         }
49         return true;
50     }
51 }

标签:字符,844,Java,String,--,复杂度,else,sb,退格
From: https://www.cnblogs.com/liu-myu/p/17345723.html

相关文章

  • java:文件写入BufferedOutputStream写入字节和PrintWriter写入字符
    BufferedOutputStream和FileOutputStream写入二进制字节方法定义publicBufferedOutputStream(OutputStreamout){示例BufferedOutputStreamwriter=newBufferedOutputStream(newFileOutputStream("demo.txt"));writer.write("helloworld".getBytes());w......
  • java使用数组实现队列
    1.1. 队列的数据结构队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。1.2. Java实现QueueTestpackagech04;publicclassQ......
  • java用数组实现栈
    1.1. 栈的数据结构栈是一种先进后出的数据结果,只能在一端(称为栈顶(top))对数据项进行插入和删除。1.2. Java实现StackTestpackagech04;publicclassStackTest{publicstaticvoidmain(String[]args){ArrayStackstack=newArrayStack(10);......
  • Json字符串转换为java对象
    1.  Json字符串转换为java对象1.1. Json字符串转换为javabeanJson2Bean.javapackagejackson;importjava.io.IOException;importorg.codehaus.jackson.map.ObjectMapper;publicclassJson2Bean{publicstaticvoidmain(String[]args)throwsIOExcepti......
  • java利用json-lib操作json
    1.1. 下载json-lib.jarhttp://sourceforge.net/projects/json-lib/files/json-lib/1.2. Java对象转换为json1.2.1.  Map对象转换为jsonMap2Json.javapackagejson;importjava.util.HashMap;importjava.util.Map;importnet.sf.json.JSONArray;publicclassMap2......
  • Java使用maven-invoker插件进行maven相关操作
    官方文档地址:https://maven.apache.org/shared/maven-invoker/index.htmlApacheMavenInvoker在许多情况下,工具(包括Maven本身)可能希望在干净的环境中启动Maven构建。为什么呢?也许您希望避免Maven插件产生的副作用污染当前系统环境。也许您想从与当前${user.dir}不同的工作目......
  • 数据结构与算法跳表之java实现
    跳表一个有序链表的搜索、添加、删除的平均时间复杂度都为O(n),那么能否利用二分搜索优化有序链表,将搜索、添加、删除的平均时间复杂度降低至O(logn)呢?链表没有像数组那样的高效随机访问(O(1)时间复杂度),所以不能像有序数组那样直接进行二分搜索优化。那有没有其他办法让有序链表的搜......
  • 十大排序算法快速排序之Java实现
    快速排序快速排序(QuickSort)是对冒泡排序的一种改进,采用的是分治策略(一般与递归结合使用),以减少排序过程中的比较次数。快速排序在1960年由查尔斯·安东尼·理查德·霍尔(CharlesAntonyRichardHoare,缩写为C.A.R.Hoare)提出,昵称为东尼·霍尔(TonyHoare)。算法步骤从数组中选择一个......
  • Java虚拟机之JVM工具监控调优
    我是攻城师(woshigcs)前几篇我们学习了,JVM里面的运行结构,GC算法,以及各种垃圾收集器的优劣点,那么本篇我们来看下如何使用一些虚拟机性能监控工具,来监控和快速处理故障,当JVM出现一些故障时,我们通常从如下的几个方面进行着手分析,包括运行日志,异常堆栈,GC日志,线程快照(threaddump/javacor......
  • Java_final 和 构造代码块
    书上的笔记转移:【REVIEW】:final除了不被重写、不被修改、不被继承、值不可变等等。。。还有以下几个特性: 1.如果成员变量的final修饰未进行赋值,那么是可以在构造方法和构造代码块进行赋值的,如果赋值成功,那么后面都不可能在进行赋值了。 ---2. 静态代码块我知道,就是只执......