Leetcode 316

Leetcode 316 Remove Duplicate Letters

开始刷题,记录一下分析过程和编码中的问题

Created with Raphaël 2.1.0 开始 未到s末尾 取s中一个newChar newChar未标记? 取栈顶oldChar newChar>oldChar? newChar压栈 结束 s中oldChar不在newChar后出现? oldChar出栈 yes no yes no yes no yes no
string stringStack;
bool isMarked(char ch){
    int markedSz=stringStack.length();
    if(markedSz==0)
        return false;
     else{
        for(int i=0; i<markedSz; i++)
        {
            if(stringStack.at(i)==ch)
                return true;
        }
        return false;
    }
}
char getStringStackTop(){
    int markedSz=stringStack.length();
    if(markedSz==0)
        return '\0';
    else
        return stringStack.at(markedSz-1);
}
void push(char ch){
    stringStack = stringStack + ch;
}
char pop(){
    char topChar=getStringStackTop();
    if(topChar=='\0')
        return topChar;
    else{
        stringStack=stringStack.substr(0,stringStack.length()-1);
        return topChar;
    }        
}
bool appearAfter(string s, char ch, int location){
    int sz=s.length();
    if(location >= sz){
        cout<<"error location"<<endl;
        return false;
    }
    else{
        for(int i=location; i<sz; i++){
            if(ch==s.at(i)){
                return true;
            }
        }
        return false;
    }
}
string removeDuplicateLetters(string s) {
    if(s.length()==0)
        return s;
    int sz=s.length();
    char newChar;
    char oldChar;
    for(int i=0; i<sz; i++){
        if(isMarked(s.at(i)));
        else{
            newChar=s.at(i);
            oldChar=getStringStackTop();
            while(oldChar!='\0'){
                if(newChar < getStringStackTop()){
                    if(appearAfter(s,oldChar,i)){
                        pop();
                        oldChar=getStringStackTop();
                    }
                    else{
                        oldChar='\0';
                    }
                }
                else
                    oldChar='\0';
            }
            push(newChar);
        }
    }
    return stringStack;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值