字符串相关题目汇总

内容会持续更新,有错误的地方欢迎指正,谢谢!

前言

字符串在编程时的使用频率非常高。字符串在C/C++和C#中的特性如下:

  1. 在C/C++中每个字符串都以’\0’结尾,比如”12345”占用6个字节。
  2. 在C#中,String的内容是不能被改变的,一旦进行改变操作,便会产生一个新的实例并返回,所以,对String进行连续多次修改,每次都会产生一个临时对象,开销挺大的。令String text="hello";,当String型数据text作为函数的形参时,并在该函数中有text="world";要想实现出了函数后,text变成”world”,则必须在形参前加ref或out。

替换空格

请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为”We Are Happy”。则经过替换之后的字符串为”We%20Are%20Happy”。

小诀窍:
需要问清楚是否必须在原来的字符串上进行替换,或者可以新建一个字符串用于替换。假设面试官规定,只能在原来的字符串上进行替换:

法一:从左向右扫描字符串替换,不足以拿到offer

  1. 一个空格替换为三个,所以每遇到一个空格,空格后面所有字符向右移动两个位置
  2. 字符串长度为n, 对每个空格而言,需要移动后面O(n)个字符,所以时间复杂度为O(n^2)

法二:从右到左扫描字符串替换,足以拿到offer

  1. 先统计空格数,新字符串长度增加 空格数 * 2
  2. 双指针:定义指针p1和p2,p1指向原字符串的末尾,p2指向新字符串的末尾
  3. 若p1指向的不是空格,把p1指针指向的字符拷贝到p2指针指向的字符;若p1指向空格, p2 向前移动并替换字符依次为 ‘0’ ‘2’ ‘%’
  4. 所有字符只移动一次,时间复杂度为O(n)
void replaceSpace(char *str,int length) {
        if(str==nullptr||length<=0)
            return;
        int numOfSpace=0;
        int numOfChar=0;
        int i=0;
        while(str[i]!='\0')
        {
            if(str[i]==' '){
                ++numOfSpace;
            }
            ++numOfChar;
            ++i;
        }
        int numOfAllChar=numOfChar+2*numOfSpace;
        if(numOfAllChar>length) //边界条件
            return;

        int numF=numOfChar;//p1   \0也要传给新字符串,不然就GG
        int numB=numOfAllChar;//p2
        while(numF>=0&&numB>numF)//numF>=0用于防止索引越界,当numB<=numF,则结束
        {
            if(str[numF]==' ')
            {
                str[numB--]='0';
                str[numB--]='2';
                str[numB--]='%';
            }
            else{
                str[numB--]=str[numF];
            }
            --numF;
        }
    }

字符串匹配

有一个字符串”BBC ABCDAB ABCDABCDABDE”,我想知道,里面是否包含目标字符串”ABCDABD”?

法一:蛮力法
法二:KMP字符串匹配算法

通过上面两道题,便可对字符串相关题型的做法有大概的认知和思路。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值