算法复习:字符串集

表示数值的字符串

以e或E分成两部分分别判断即可。

int maxl(int a,int b)
{
    if(a>b)
        return a;
    return b;
}
class Solution {
public:
    bool isNumeric(string str)
    {
        int lable=0,pos=maxl(str.find("e",0),str.find("E",0));
        string up="",down="";
        if(pos==-1)
            up=str;
        else
        {
            up=str.substr(0,pos);
            down=str.substr(pos+1,str.size()-pos);
            if(down=="")
                return false;
        }
        for(int i=0;i<up.size();i++)
        {
            if((up[i]=='+'||up[i]=='-')&&i==0)
                continue;
            if((up[i]=='+'||up[i]=='-')&&i!=0)
                return false;
            if(up[i]=='.')
            {
                if(lable==1)
                    return false;
                lable=1;
                if(up[i+1]>='0'&&up[i+1]<='9')
                    continue;
                else
                    return false;
            }
            if(up[i]<'0'||up[i]>'9')
                return false;
        }
        for(int i=0;i<down.size();i++)
        {
            if((down[i]=='+'||down[i]=='-')&&i==0)
                continue;
            if((down[i]=='+'||down[i]=='-')&&i!=0)
                return false;
            if(down[i]=='.')
                return false;
            if(down[i]<'0'||down[i]>'9')
                return false;
        }
        return true;
    }

};
牛客

字符流中第一个不重复的字符

一个维护当前首次出现的字符顺序表,一个维护出现的字符数目表

class Solution
{
public:
    string donser;
    void Insert(char ch)
        donser=donser.insert(donser.size(),1,ch);     
    char FirstAppearingOnce()
    {
        char first=donser[0];
        vector<char>vec;
        vector<char>::iterator it;
        map<char,int>mp;
        for(int i=0;i<donser.size();i++)
        {
            it=find(vec.begin(),vec.end(),donser[i]);
            if(it==vec.end()&&mp[donser[i]]==0)
                vec.push_back(donser[i]);
            else if(it!=vec.end()&&mp[donser[i]]!=0)
                vec.erase(it);
            mp[donser[i]]++;
        }
        if(vec.size()==0)
            return '#';
        return *(vec.begin());
    }

};
牛客

面试题 08.09. 括号

给定一个数n,表示总共有n个左括号,n个右括号,输出不同的匹配,右括号不能多于左括号

class Solution {
public:
    int N;//最多的括号数目
    vector<string> result;
    string tmp;
    void loop(int l,int r)
    {
        //cout<<"L:"<<l<<" R:"<<r<<endl;
        if(l<N)
        {
            if(l==r)
            {
                tmp[l+r]='(';
                loop(l+1,r);
            }
            else if(l>r)
            {
                tmp[l+r]='(';
                loop(l+1,r);
                tmp[l+r]=')';
                loop(l,r+1);
            }
        }
        else if(l==N)//左括号饱和
        {
            if(r<N)//右括号没包和
            {
                tmp[l+r]=')';
                loop(l,r+1);
            }
            else if(r==N)
            {
                result.push_back(tmp);
                //cout<<tmp<<endl;
                return;
            }
        }
        return;
    }
    vector<string> generateParenthesis(int n) {
        string str(n*2,'0');
        N=n;
        tmp=str;
        loop(0,0);
        return result;
    }
};
View Code

leetcode 6. Z 字形变换

找数字行间下标规律

class Solution {
public:
    string convert(string s, int numRows) {
        if(numRows<=1)
            return s;
        string result="";
        int seg1=(numRows-1)*2;
        int seg2=0;
        for(int i=0;i<numRows;i++)//逐行处理
        {
            int now=i;//记录当前下标
            int last=-1;//记录上一个下标
            int lb=0;//循环两种间隔
            while(now<s.size())//循环输出
            {
                if(last!=now)//排除间隔为0的情况
                    result+=s[now];
                if(lb==0)
                {
                    lb=1;
                    last=now;
                    now+=seg1;
                }
                else if(lb==1)
                {
                    lb=0;
                    last=now;
                    now+=seg2;
                }
            }
            seg1-=2;
            seg2+=2;
        } 
        return result;
    }
};
leetcode 6
原文地址:https://www.cnblogs.com/dzzy/p/12275518.html