内容会持续更新,有错误的地方欢迎指正,谢谢!
前言
字符串在编程时的使用频率非常高。字符串在C/C++和C#中的特性如下:
- 在C/C++中每个字符串都以’\0’结尾,比如”12345”占用6个字节。
- 在C#中,String的内容是不能被改变的,一旦进行改变操作,便会产生一个新的实例并返回,所以,对String进行连续多次修改,每次都会产生一个临时对象,开销挺大的。令
String text="hello";
,当String型数据text作为函数的形参时,并在该函数中有text="world";
要想实现出了函数后,text变成”world”,则必须在形参前加ref或out。
替换空格
请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为”We Are Happy”。则经过替换之后的字符串为”We%20Are%20Happy”。
小诀窍:
需要问清楚是否必须在原来的字符串上进行替换,或者可以新建一个字符串用于替换。假设面试官规定,只能在原来的字符串上进行替换:
法一:从左向右扫描字符串替换,不足以拿到offer
- 一个空格替换为三个,所以每遇到一个空格,空格后面所有字符向右移动两个位置
- 字符串长度为n, 对每个空格而言,需要移动后面O(n)个字符,所以时间复杂度为O(n^2)
法二:从右到左扫描字符串替换,足以拿到offer
- 先统计空格数,新字符串长度增加 空格数 * 2
- 双指针:定义指针p1和p2,p1指向原字符串的末尾,p2指向新字符串的末尾
- 若p1指向的不是空格,把p1指针指向的字符拷贝到p2指针指向的字符;若p1指向空格, p2 向前移动并替换字符依次为 ‘0’ ‘2’ ‘%’
- 所有字符只移动一次,时间复杂度为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字符串匹配算法
通过上面两道题,便可对字符串相关题型的做法有大概的认知和思路。