一般面试字符串的题目分四种:1, 基本运算(求长度,连接,比较)2. 格式转换(atoi, itoa) 3.字符串翻转 4. 模式匹配。
1. 基本运算
a. 赋值操作
函数原型:int StrAssign(const char *s, char *t)
函数说明:将s的内容付给t
函数定义:
int StrAssign(const char *s, char *t){
}
b. 连接操作
函数原型:int Concat(char *s, const char *t)
函数说明:将串t连接到串s的尾部,形成一个新串
函数定义:
int Concat(char *s, const char *t){
}
c.求长度
函数原型:int StrLen(char *s)
函数说明:返回串s的长度
函数定义:
int StrLen(char *s){
}
d. 字符串比较
函数原型:int StrCmp(const char *s, const char *t)
函数说明:比较两个串的大小,返回值为-1,0,1表示s<t, s=t,s>t。
函数定义:
int StrCmp(const char *s, const char *t){
}
//不区分大小写的字符串比较函数
int stricmp(const char *s, const char *t){
}
2.
a.将字符串转换成整数
b.将整数转换为字符串
3、字符串翻转,这里有两种翻转,第一种是翻转整个字符串,第二种是翻转句子中的单词。
a. 翻转整个字符串
函数原型:void Reverse(char *s1)
函数说明:"abcd"=>"dcba"
函数定义:
void Reverse(char *s1){
}
b. 翻转句子中的单词
函数原型:void ReverseWord(char *s1)
函数说明:"today is sunday"=>"sunday is today"
函数定义:
void ReverseWord(char *c){
//先对整个句子进行翻转
//在对句子的每个单词进行翻转
Reverse(c);
}
在ReverseWord函数调用了ReverseChar函数对给出字符串的起始位置做翻转
void ReverseChar(char *ch,
}
4、字符串的模式匹配
给一个串T,和子串P,返回是否子串p是否和串T中有子串匹配,如果有,返回位置;没有返回0。
假设P为给定的子串,T是待查找的字符串
T:
P:
用P中的字符依次与T中的字符进行比较,遇到不相等的字符,则可将P右移一个字符,从新进行比较,直到某次匹配成功或者到达P的最右字符移出T为止。
如: 若P="aaaba", T="aaabbaaaba", 则匹配过程如下图
上述朴素字符串匹配算法的时间复杂性为0(M*N).
朴素匹配算法函数定义:
int Index(const char *res, const char *str, int position)
{
}
在朴素的匹配算法中,从头回溯重新匹配是没有必要的。
KMP主要解决两个问题:
a. 当字符串比较出现不等时,确定下一趟比较前应该将P右移多少个字符;
b. P右移后,应该从哪个字符开始和T中刚才比较时不等的那个字符继续开始比较.
每当一趟匹配过程中出现字符比较不等时,不需回溯主串S的指针,而是利用已经得到的“部分匹配”结果将模式串向右“滑动”尽可能远的一段距离后,继续进行比较。模式串到底向右滑动多少,在KMP算法中是用一个数组来存储的。针对模式串中的每个索引j,都将有一个对应的值。此值的含义为模式串中位置从0到j-1构成的串中所出现的首尾相同的子串的最大长度加1。
因此,KMP算法计算next数组是关键。
void GetNext(char *p, int next[]){
}
KMP匹配算法函数:
int Index_KMP(char *s, char *p, int pos, int next[]){