LeetCode:比较含退格的字符串

题目:

给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果。 # 代表退格字符。

注意:如果对空文本输入退格字符,文本继续为空。

输入:S = "ab#c", T = "ad#c"
输出:true
解释:S 和 T 都会变成 “ac”。

来源:力扣(LeetCode)

解:

这道题第一种方法,重构字符串。双指针滑动检查字符,当遍历遇到非'#'时保存至新字符数组尾指针,否则尾指针退一个值(表示删除,注意溢出问题)。最后比较新字符数组是否相等。时间O(n),空间O(1),如果字符串转数组不计算空间的话。当然,也有人用栈来做,就是浪费内存而已。

class Solution {
    public boolean backspaceCompare(String S, String T) {
        char[] rss=S.toCharArray();
        char[] rst=T.toCharArray();
        //字符遍历检查,重构
        int s=0;
        for(int i=0;i<rss.length;i++){
            if(rss[i]!='#'){
                rss[s++]=rss[i];
            }else{
                s--;
                if(s<0){
                    s=0;
                }
            }
        }
        int t=0;
        for(int i=0;i<rst.length;i++){
            if(rst[i]!='#'){
                rst[t++]=rst[i];
            }else{
                t--;
                if(t<0){
                    t=0;
                }
            }
        }
        //相等判断,由于有尾部冗余,所以直接遍历判断
        if(t!=s){
            return false;
        }
        for(int i=0;i<s;i++){
            if(rss[i]!=rst[i]){
                return false;
            }
        }
        return true;
    }
}

第二种方法,这道题中,字符串所有删除字符'#'已经确定,'#'就删前一个有效字符,而'#'后面的必定是存在的,相同又要求所有保留字符都相等,即尾部字符相等。所以用双数组双指针,逆序遍历比较,相同则下一个,不同则直接返回false,遇到'#'则向前滑动相应步数。

时间复杂度O(n),空间复杂度O(1),注意如果碰到不相同的情况,可能前几个字符直接就返回了,时间O(1),这就是为什么这个算法优于重构算法的原因。

代码略。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值