代码随想录——字符串习题合集

344. 反转字符串

void reverseString(vector<char>& s) {
            for(int i=0;i<s.size()/2;i++){
                char c;
                c=s[i];
                s[i]=s[s.size()-i-1];
                s[s.size()-i-1]=c;
            }
    }

541. 反转字符串 II

  string reverseStr(string s, int len) {
             for(int i=0;i<s.size();i++){
                int j=i+2*len-1;
                int k=i+len-1;
                if(j>=s.size()&&k>s.size()){
                    reverse(s.begin()+i,s.end());break;
                }else if(j>=s.size()&&k<s.size()){
                      reverse(s.begin()+i,s.begin()+k+1);break;
                }else if(j>=s.size()&&k==s.size()) {
                     reverse(s.begin(),s.begin()+k);break;
                }else {
                        reverse(s.begin()+i,s.begin()+k+1); 
                        i=j;
                }
            }
            return s;
    }

剑指 Offer 05. 替换空格

string replaceSpace(string s) {
        string res;
            for(int i=0;i<s.size();i++){
                if(s[i]==' ') res+="%20";
                else res+=s[i];
            }
            return res;
    }

 151. 反转字符串中的单词

string reverseWords(string s) {
             string res;
             vector<string> ss;
             string xx[1010];
           int len=0;
           for(int i=0,j=0;i<s.size();i++,j++){
               if(s[i]==' ')continue;
                string temp;
               while(s[j]!=' '&&j<s.size()) {
                   temp+=s[j];
                    j++;
               }
                ss.push_back(temp);
               len++;
               i=j;
           }
           for(int i=0;i<=ss.size()/2;i++){
             int j=ss.size()-i-1;
               xx[i]=ss[j];
             xx[j]=ss[i];
           }
            for(int i=0;i<len;i++){
                for(int j=0;j<xx[i].length();j++){
                    res+=xx[i][j];
                }
                if(i!=len-1) res+=" ";
            }
            return res;
    }

剑指 Offer 58 - II. 左旋转字符串

string reverseLeftWords(string s, int n) {
            string res;
             res+=s.substr(n);
             for(int i=0;i<n;i++) res+=s[i];
             
             return res;
    }

28. 找出字符串中第一个匹配项的下标

 int strStr(string haystack, string needle) {
        int sumh[haystack.size()];
        int sumn=0;
        for(int i=0;i<needle.size();i++)  sumn+=needle[i]*needle[i];

        sumh[0]=haystack[0]*haystack[0];
        for(int i=1;i<haystack.size();i++){
            sumh[i]=sumh[i-1]+haystack[i]*haystack[i];
        }

        for(int i=0;i<haystack.size();i++){
            if(haystack[i]!=needle[0]) continue;

            int end=i+needle.size()-1;
            int hash;

            if(end>=haystack.size()) return -1;

            if(i>0) hash=sumh[end]-sumh[i-1];
            else  hash=sumh[end];

            if(hash==sumn)
            {
              //  cout<<i<<endl;
                int flag=0;
                for(int xx=i,z=0;xx<=end;xx++,z++)
                    if(haystack[xx]!=needle[z]) flag=1;
                
                if(flag==0) return i;   
            } 
        }
        return -1;
    }

459. 重复的子字符串

    int get(string s){
        int res=0;
        for(int i=0;i<s.size();i++) res+=s[i]*s[i];

        return res;
    }
    bool repeatedSubstringPattern(string s) {
        if(s.size()==1) return false;
        
        int sums=get(s);

        for(int len=1,i=0;len<=s.size()/2;len++){
            if(sums%get(s.substr(0,len))==0){
                string emp=s.substr(0,len);
                int flag=0;
                for(int start=0;start<s.size();){
                    string cmp=s.substr(start,len);
                    if(cmp!=emp) {
                        flag=1;break;
                    }
                    start+=len;
                }
                if(flag==0)  return true;
            } 
        }

        return false;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值