力扣844(Java)-比较含退格的字符串(简单)
题目:
给定 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)
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
方法一:使用栈的思路
- 当 当前字符不为 ‘#’时,将其弹入字符栈中;
- 当当前字符为‘#’ 且字符栈不为空时,弹出字符栈的最后一个字符;
- 最后将两个字符栈中的字符进行比较即可。
可以通过,但是复杂度不满足进阶题意
- 时间复杂度: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 }
2023-05-19:二刷还是写不出来
1 class Solution {
2 public boolean backspaceCompare(String s, String t) {
3 char[] ch1 = s.toCharArray();
4 char[] ch2 = t.toCharArray();
5 return getString(ch1).equals(getString(ch2));
6 }
7 public String getString(char[] ch){
8 int slow = 0;
9 for (int fast = 0; fast < ch.length; fast++){
10 if (ch[fast] != '#') {
11 ch[slow] = ch[fast];
12 slow++;
13 }else {
14 if (slow > 0) slow--;
15 }
16 }
17 return new String(ch).substring(0, slow);
18 }
19 }
力扣844(Java)-比较含退格的字符串(简单)的更多相关文章
- LeetCode--844--比较含退格的字符串(java)
给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果. # 代表退格字符. 示例 1: 输入:S = "ab#c", T = " ...
- 【LeetCode题解】844_比较含退格的字符串(Backspace-String-Compare)
目录 描述 解法一:字符串比较 思路 Java 实现 Python 实现 复杂度分析 解法二:双指针(推荐) 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解笔记可以 ...
- [Swift]LeetCode844. 比较含退格的字符串 | Backspace String Compare
Given two strings S and T, return if they are equal when both are typed into empty text editors. # m ...
- leetcode-844-比较含退格的字符串(用vector取代stack)
题目描述: 给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果. # 代表退格字符. 示例 1: 输入:S = "ab#c", T = ...
- Q844 比较含退格的字符串
给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果. # 代表退格字符. 示例 1: 输入:S = "ab#c", T = " ...
- Leetcode844.Backspace String Compare比较含退格的字符串
给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果. # 代表退格字符. 示例 1: 输入:S = "ab#c", T = " ...
- C#LeetCode刷题之#844-比较含退格的字符串(Backspace String Compare)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4030 访问. 给定 S 和 T 两个字符串,当它们分别被输入到空 ...
- LeetCode844 比较含退格的字符串
题目描述: 给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果. # 代表退格字符. 示例 1: 输入:S = "ab#c", T = ...
- LeetCode:比较含退格字符串【844】
LeetCode:比较含退格字符串[844] 题目描述 给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果. # 代表退格字符. 示例 1: 输入:S = ...
- [LeetCode] 844. Backspace String Compare 退格字符串比较
Given two strings S and T, return if they are equal when both are typed into empty text editors. # m ...
随机推荐
- vscode 尾逗号不自动删除 'comma-dangle': 'off' eslint vue
vscode 尾逗号不自动删除 'comma-dangle': 'off' eslint 外层环境说明 vscode eslint - .elintrs.js vue - vue开发 vetur - ...
- AntSK 0.2.3 版本更新:轻松集成 AI 本地离线模型
大家好,今天和大家分享 AntSK 知识库/智能体项目的最新进展. AntSK 是一个基于 .Net 8.Blazor 及 SemanticKernel 开发的 AI 项目,旨在为开发者提供一个强大的 ...
- 舒服了,学习了,踩到一个 Lombok 的坑!
你好呀,我是歪歪. 踩坑了啊,最近踩了一个 lombok 的坑,有点意思,给你分享一波. 我之前写过一个公共的服务接口,这个接口已经有好几个系统对接并稳定运行了很长一段时间了,长到这个接口都已经交接给 ...
- Anaconda使用教程
0 写在前面 以下命令都是在命令行模式下进行操作,macOS和Linux用户可以直接打开Terminal终端,Windows用户如果配置了环境变量则可以直接打开cmd,否则需要打开Anaconda P ...
- C++ 中的 volatile 和 atomic
C++ 中的 volatile 和 atomic 0. TL;DR std::atomic 用于多线程并发场景,有两个典型使用场景: 原子操作:对 atomic 变量的操作(读/写/自增/自减)仿佛受 ...
- 高德地图和echarts结合实现地图下钻(二)
一.学习ajax发送异步请求 1 $(function(){ 2 //请求参数 3 var list = {}; 4 // 5 $.ajax({ 6 //请求方式 7 type : "POS ...
- .net和java串口通讯压力测试对比
最近由于工作要求,需要对一个串口通讯设备进行压力测试,要求连续持续对串口设备发送指令,无间隔,测试设备是否会死机. 要求做到毫秒级,测试第三方的工具,基本上都无法达到毫秒级,最少的也是10毫秒. 于是 ...
- #主席树,离散,扫描线#洛谷 3168 [CQOI2015]任务查询系统
题目 分析 询问显然得预处理,考虑以优先级建权值线段树, 将优先级离散化处理,那么第\(k\)大可以用线段树来求 那任务怎么办,考虑时间用扫描线的方法,按照时间建新的线段树 把任务分成两部分,在两端差 ...
- OpenHarmony应用ArkUI 状态管理开发范例
本文转载自<#2023盲盒+码# OpenHarmony应用ArkUI 状态管理开发范例>,作者:zhushangyuan_ 本文根据橘子购物应用,实现ArkUI中的状态管理. 在声明 ...
- OpenCV一句话将彩色图片(Mat)转换为灰度
auto in_gray=cv::imdecode(in, cv::IMREAD_GRAYSCALE);