代码随想录额外题目| 字符串 ●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()||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 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: "<

但随想录是 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条件不对,要注意

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

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;
    }

你可能感兴趣的:(代码随想录一刷,算法,数据结构,leetcode,c++)