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

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

### 华为机考ACM考试内容及准备方法 #### 考试内容概述 华为机考ACM模式主要考察考生的算法设计能力、编程实现能力和逻辑思维能力。通常情况下,考试会涉及以下几个方面的内容[^1]: - **基础数据结构**:数组、链表、栈、队列等。 - **经典算法**:动态规划、贪心算法、分治法、回溯法等。 - **字符串处理**:字符串匹配、最长公共子序列等问题。 - **图论**:最短路径、最小生成树、拓扑排序等。 具体到题目形式上,可能会有如下几类问题: - 输入输出优化问题,例如如何高效读取大量数据并进行计算[^3]。 - 动态规划问题,如求解两个字符串之间的最长公共子序列长度。 - 排序与查找问题,可能涉及到自定义排序规则或者复杂条件下的二分查找。 #### 准备方法建议 为了更好地应对华为机考ACM模式,可以从以下几个方向着手准备[^2]: 1. **系统化学习基础知识** - 使用《代码随想录》作为指导书籍,按照其推荐的学习路线逐步深入理解各类数据结构和算法的核心概念及其应用场景。 2. **针对性练习典型题目** - 在力扣平台上完成至少80道高质量习题,覆盖常见的考点范围。 - 刷历年来的华为机考真题集锦(可通过CDSN或其他正规渠道获取),熟悉实际考试风格以及难度分布。 3. **强化实践操作技能** - 多参与模拟测试环境下的限时答题训练活动,锻炼快速分析问题本质的能力,并提升编码效率。 - 对于每一道做过的题目都要认真总结反思,找出薄弱环节加以改进。 4. **注重细节把控** - 学会对程序运行时间和空间消耗做出合理预估,在满足功能需求前提下追求更优性能表现。 - 特别关注边界条件处理部分,避免因考虑不周而导致错误提交失败的情况发生。 以下是针对某一特定类型——字符串相似度判断的一个简单例子展示: ```python def lcs_length(s1, s2): m, n = len(s1), len(s2) dp = [[0]*(n+1) for _ in range(m+1)] for i in range(1,m+1): for j in range(1,n+1): if s1[i-1]==s2[j-1]: dp[i][j]=dp[i-1][j-1]+1 else: dp[i][j]=max(dp[i-1][j],dp[i][j-1]) return dp[m][n] if __name__=='__main__': a=input().strip() b=input().strip() res=lcs_length(a,b) print(res) ``` 此段代码实现了基于动态规划思想来解决两串字符间最大相同子序列长度的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值