• 算法复习:字符串


    手撕字符串复制

    char * strcppy(char * dest,const char *src,size_t count)
    {
        char *tmp = dest;
        while (count-- && (*dest++ = *src++) != '');
        return tmp;
    }

    c++常用string操作:

    #include<algorithm>

    reverse(s.begin(),s.end()); //字符串反转

    string result=s.substr(pos, n); //截取字符串s从pos开始的n个

    string result=s.substr(pos) ; //截取从pos开始到最后的字符串

    strcpy (str2,str1); //把str1复制给str2

    int result=strcmp(str1,str2); //比较str1和str2  result<0则str1小

    leetcode 5. 最长回文子串

    输入串s,串s的反转串t,题目转化为求s和t最长连续子串,

    但是有一个限制条件是找到的这个回文串 在t中的位置折合回s应该能对应才行,反例:"aacdefcaa" 用最长连续子串找到的是aac,而aac不符合题意

    #include<algorithm>
    class Solution {
    public:
        string longestPalindrome(string s) {
            string t=s;
            if(s.size()<1)
                return s;
            reverse(t.begin(),t.end());
            int size=s.size();
            int lb_i,lb_j,maxl=0;//用于保存取到最大长度时的位置
            vector<vector<int> >dp(size,vector<int>(size,0));
            for(int i=0;i<size;i++)//初始化
            {
                if(s[i]==t[0])
                {
                    dp[i][0]=1;
                    maxl=1;lb_i=i;lb_j=0;
                }
                if(s[0]==t[i])
                {
                    dp[0][i]=1;
                    maxl=1;lb_i=0;lb_j=i;
                }
            } 
                    
            for(int i=1;i<size;i++)
            {
                char A=s[i];
                for(int j=1;j<size;j++)
                {
                    char B=t[j];
                    if(A==B)
                    {
                        dp[i][j]=dp[i-1][j-1]+1;
                        if(dp[i][j]>maxl)
                        {
                            int pre=size-1-j;//找回原来位置,用于对比是否匹配
                            pre=pre+dp[i][j]-1;
                            if(pre!=i)//位置不对应的不算 "aacdefcaa" 排除aac
                                continue;
                            maxl=dp[i][j];lb_i=i;lb_j=j;
                        }
                    }
                }
            }
            /*for(int i=0;i<size;i++)
            {
                for(int j=0;j<size;j++)
                {
                    cout<<dp[i][j]<<" ";
                }
                cout<<endl;
            }
            cout<<lb_i<<" "<<size-(lb_j+1-maxl)<<" "<<maxl;*/
            return s.substr(lb_i-maxl+1,maxl);
        }
    };
    leetcode 5

    面试题58 - I. 翻转单词顺序

    class Solution {
    public:
        void exchange(int head,int tail,string &s)
        {
            char tmp;
            while(head<tail)
            {
                tmp=s[head];
                s[head]=s[tail];
                s[tail]=tmp;
                head++;
                tail--;
            }
            return;
        }
        string deal(string s)
        {
            if(s=="")
                return s;
            string::iterator it=s.begin();
            while(*it==' ')
            {
                if(s.size()==1)
                    return "";
                it=s.erase(it);
            }
            it=s.begin();
            char last=*it;
            it++;
            for(;it!=s.end();it++)
            {
                if(last==' '&&*it==' ')
                {
                    it=s.erase(it);
                    it--;
                }
                else
                {
                    last=*it;
                }
            }
            return s;
        }
        string reverseWords(string s) {
            s=deal(s);
            int size=s.size(),head=0,tail=size-1,lable=0;
            exchange(head,tail,s);
            for(int i=0;i<size;i++)
            {
                if(lable==0&&s[i]!=' ')
                {
                    head=i;
                    lable=1;
                }
                if(lable==1&&(s[i]==' '||i==size-1))
                {
                    tail=i-1;
                    lable=0;
                    if(i==size-1)
                        exchange(head,tail+1,s);
                    else
                        exchange(head,tail,s);
                }
            }
            return deal(s);
        }
    };
    View Code

    面试题58 - II. 左旋转字符串

    class Solution {
    public:
        void exchange(int head,int tail,string &s)
        {
            char tmp;
            while(head<tail)
            {
                tmp=s[head];
                s[head]=s[tail];
                s[tail]=tmp;
                head++;
                tail--;
            }
            return;
        }
        string reverseLeftWords(string s, int n) {
            int size=s.size(),head=0,tail=size-1;
            exchange(head,tail,s);
            exchange(tail-n+1,tail,s);
            exchange(head,tail-n,s);
            return s;
        }
    };
    View Code
  • 相关阅读:
    c#可以做什么
    C#是否快被年代所筛选?
    在.NET程序中,C#办法可用来封装代码
    关于程序员的小故事
    码农需了解的代码编写标准
    关于HTML代码的技巧
    分析一波编程语言的前景
    彻底解决Linux索引节点(inode)占用率高的告警
    Python29之字符str与字节bytes
    Python28之文件1
  • 原文地址:https://www.cnblogs.com/dzzy/p/12495422.html
Copyright © 2020-2023  润新知