题目
将一串字符串中某个字符替换成特定的字符串;
例如:给定一个足够长的字符串"i am a student",将其中的空格字符替换成字符串"##??";
思路
应尽可能保证时间复杂度与空间复杂度保持在低位
尽可能不创建新的数组;
首先考虑是否可以在原数组中进行操作,由于是将字符串中某一特定字符替换为多个字符,如果直接替换可能导致原字符串中其它字符被覆盖,所以考虑从后向前进行筛选替换,将无需替换的字符直接后移一定位数,再将新替换字符串逐个打印替换即可。
主体
int main() {
char str[NEM] = "i am a student";//原字符串
char aim = ' ';//需要替换的字符
char scr[] = "##??";//替换字符串
replace(str,aim,scr);//将需要替换的字符串及替换对象传入替换函数
printf("%s", str);
return 0;
}
首先后移位数与需替换的字符数量有关,count记录需替换字符个数
size_t Getcount(char* str, char oldchar) {
size_t count = 0;
while (*str != '\0') {
if (*str++ == oldchar) {
count++;
}
}
return count;
}
替换函数
void replace(char* str, char oldchar, char* scr) {
size_t count = Getcount(str, oldchar);//统计str中需要替换的字符个数
int i = strlen(str);//统计字符串有效字符个数,将i定位于字符串最后一位有效位数上
int j = i + count * (strlen(scr) - 1);//将j定位于后置替换起点
while (i > 0) {
if (str[i] != oldchar) {
str[j--] = str[i--];
}
else {
for (int z = strlen(scr)-1; z >=0;j--,z--) {//此处应反向打印
str[j] = scr[z];
}
i--;
}
}
}
结果
总结
本文中的时间复杂度和空间复杂度分别为O(n)和O(1);
要给定一个足够长的字符串否组替换时可能会出现越界现象
注意本题中i和j的取值。
源代码
#include<stdio.h>
#include<string.h>
#define NB 128
//将字符串中 某字符 替换为其它 字符串
size_t Getcount(char* str, char oldchar) {
size_t count = 0;
while (*str != '\0') {
if (*str++ == oldchar) {
count++;
}
}
return count;
}
void replace(char* str, char oldchar, char* scr) {
size_t count = Getcount(str, oldchar);//统计str中需要替换的字符个数
int i = strlen(str);//统计字符串有效字符个数,将i定位于字符串最后一位有效位数上
int j = i + count * (strlen(scr) - 1);//将j定位于后置替换起点
while (i > 0) {
if (str[i] != oldchar) {
str[j--] = str[i--];
}
else {
for (int z = strlen(scr)-1; z >=0;j--,z--) {//此处应反向打印
str[j] = scr[z];
}
i--;
}
}
}
int main() {
char str[NB] = "i am a student";//原字符串
char aim = ' ';
char scr[] = "##??";
replace(str,aim,scr);//将需要替换的字符串及替换对象传入函数
printf("%s", str);
return 0;
}