代码随想录额外题目| 字符串 ●925长键按入 ●844比较退格的字符串

#925长键按入 easy

mycode:思路就是遇到重复的,name一边跳过一边数有几个,typed也一边跳过一边数,typed的数量要>=name的

bool isLongPressedName(string name, string typed) {
        int i=0; int j=0; 
        int cnt1, cnt2;
        while(1){
            if(name[i]!=typed[j]) return false;
            cnt1=1;
            while(i+1<name.size() && name[i]==name[i+1]){
                cnt1++;
                i++;
            }
            cnt2=1;
            while(j+1<typed.size() && typed[j]==typed[j+1]){
                cnt2++;
                j++;
            }
            if(cnt2<cnt1) return false;
            i++; j++;
            if(i>=name.size()||j>=typed.size()) break;
        }
        if(i==name.size() && j==typed.size()) return true;
        return false;
        
    }

随想录思路也差不多,但觉得比我的麻烦,就没放了 

#844比较退格的字符串 easy

容易方法容易,难方法难(不能用额外空间的)

容易方法:用stack,非常擅长匹配消除问题

我的code:

bool backspaceCompare(string s, string t) {
        stack<char> st;
        
        for(char &c:s){
            if(c=='#' && !st.empty()) st.pop();
            else if(c!='#') st.push(c);
        }
        s="";
        while(!st.empty()){
            s+=st.top();
            st.pop();
        }
        for(char &c:t){
            if(c=='#' && !st.empty()) st.pop();
            else if(c!='#') st.push(c);
        }
        t="";
        while(!st.empty()){
            t+=st.top();
            st.pop();
        }
        //cout<<"s: "<<s<<", t:"<<t<<endl;
        return s==t;
    }

但随想录是 pop和放到result里合并在一起了。而且使用的string当做stack来用,也很好:

string 可以用 pop_back() 和 += ,很方便

 bool backspaceCompare(string S, string T) {
        string s; // 当栈来用
        string t; // 当栈来用
        for (int i = 0; i < S.size(); i++) {
            if (S[i] != '#') s += S[i];
            else if (!s.empty()) {
                s.pop_back();

        }
        for (int i = 0; i < T.size(); i++) {
            if (T[i] != '#') t += T[i];
            else if (!t.empty()) {
                t.pop_back();
            }
        }
        if (s == t) return true; // 直接比较两个字符串是否相等,比用栈来比较方便多了
        return false;
    }

难的方法 空间O1 的,看了随想录思路自己实现的:

并没有真正地修改字符串S,而是通过调整skip和i的值,来模拟处理了'#'字符(即退格键)的影响

然后我一开始最外面的while条件不对,要注意

bool backspaceCompare(string s, string t) {
        int skips=0;
        int skipt=0;
        int i=s.size()-1;
        int j=t.size()-1;
        while(1){

            while(i>=0){
                if(s[i]=='#') skips++;
                else{
                    if(skips>0) skips--;
                    else break;
                }
                i--;
            }

            while(j>=0){
                if(t[j]=='#') skipt++;
                else{
                    if(skipt>0) skipt--;
                    else break;
                }
                j--;
            }

            if(j<0||i<0) break;
            if(s[i]!=t[j]) return false;
            i--; j--;
        }
        if(i==-1 && j==-1) return true;
        return false;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值