【Java】比较含退格的字符串

在这里插入图片描述

一开始想到用栈存储字符串,也想过用指针,但不知道从前往后如何比较。后面尝试用双指针从后往前遍历。

1.栈方法解决

class Solution {
    public boolean backspaceCompare(String s, String t) {
        //栈解决
        ArrayStack stack = new ArrayStack(s.length());
        for(int i=0;i<s.length();i++){
            if(s.charAt(i)!='#'){
                stack.push(s.charAt(i));
            }
            // else if(s.charAt(i)=='#' && stack.isEmpty()!=true){
            else if(s.charAt(i)=='#' && stack.size()>0){

                stack.remove();
            }
        }
        ArrayStack stackT = new ArrayStack(t.length());
        for(int i=0;i<t.length();i++){
            if(t.charAt(i)!='#'){
                stackT.push(t.charAt(i));
            }
            // else if(t.charAt(i)=='#' && stackT.isEmpty()!=true){
            else if(t.charAt(i)=='#' && stackT.size()>0){

                stackT.remove();
            }
        }
        if(stack.size()!=stackT.size()) return false;


        //remove后size会变小 因此无法全部遍历
        // for(int i=0;i<stack.size();i++){
        //     if(stack.remove()!=stackT.remove())return false;
        // }
         while (!stack.isEmpty()) {
            if (stack.remove() != stackT.remove()) {
                return false;
            }
        }

        return true;
    }
}

class ArrayStack{
    private int maxSize;//栈大小
    private int top;//栈顶
    private char[] stack;//存放栈数据

    //方法为 push、remove、isEmpty、isFull、size、peak
    //构造函数
    ArrayStack(int maxSize){

        this.maxSize = maxSize;
        this.top = -1;
        this.stack = new char[maxSize];
    }
    public void push(char c) {
        // if(isFull())throw new Exception("栈满");
        top++;
        stack[top] = c;
    }
    public int remove() {
        // if(isEmpty())throw new Exception("栈空");
        top--;
        return stack[top+1];
    }
    public boolean isEmpty(){
        return top==-1;
    }
    public boolean isFull(){
        return top+1==maxSize;
    }
    public int size(){
        return top+1;
    }
}

AC了但内存占用比较大
在这里插入图片描述

2.双指针法解决

每个字符串都有一个遍历当前位置的指针i和j,以及存储当前需退格的长度sBack和tBack。以字符串s为例,首先从后往前判断有无需要退格的字符,遇到#则sBack++,指针往前一个继续判断前一位是否需要退格,直至当前非#;然后通过i–跳过当前需退格的字符。直至无需退格的的位置(即i指向)。再与字符串t当前指针j指向的位置进行比较,若字符不同则返回false,若i和j有任意一个指向-1,继续判断i和j是否都指向-1,若有一个还指向字符则说明两者长度不一致,返回false。

class Solution {
    public boolean backspaceCompare(String s, String t) {

        //双指针解决
        int sLength = s.length();
        int tLength = t.length();
        int sBack = 0,tBack =0;//双指针记录#的当前个数 ij记录当前比较字符位置
        for(int i=sLength-1,j=tLength-1;i>=0||j>=0;i--,j--){
            //先判断s和t是否需要跳过字符 然后再进行字符比较
            
            while(i>=0){
                if(s.charAt(i) =='#'){
                    sBack++;
                    i--;
                }
                else if(sBack>0){
                    sBack--;
                    i--;
                }
                else{
                    break;//循环退格 不退格则退出
                }
            }
            while(j>=0){
                if(t.charAt(j) =='#'){
                    tBack++;
                    j--;
                }
                else if(tBack>0){
                    tBack--;
                    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;
                }
            }

        }
        return true;
    }
}


可能是变量开太多了内存占用比较大
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值