问题描述
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
解决方法
1.暴力法
void ReplaceBlank(char* str) {
for(int i = 0; i < strlen(str); ++i) {
if(str[i] != ' ') continue;
for(int j = strlen(str) + 2; j > i+2; --j) {
str[j] = str[j - 2];
}
str[i] = '%';
str[i+1] = '2';
str[i+2] = '0';
//strncpy(str+i, "%20", 3);
}
}
由于每次都要循环移动替换位置之后的元素,因此暴力法使用了O(n^2)的时间复杂度。
2.双指针法
void ReplaceBlank(char* str) {
int n = 0;
//先计算出总的空格数
for(int i = 0; i < strlen(str); ++i) {
if(*(str+i) == ' ') ++n;
}
//双指针法
char* pA = str + strlen(str);
char* pB = pA + 2 * n;
while(pA != pB) { //指针必定相遇
if(*pA != ' ') { //不为空格,直接移动到pB处
*pB = *pA;
} else { //位空格,用%20填充
pB -= 2;
strncpy(pB, "%20", 3);
}
--pA, --pB; //前移
}
}
双指针法使得每个元素只需要移动一次就可以移动到正确的位置,因此算法时间复杂度为O(n)
总结
- 暴力解法中,由于每找到一个空格就需要将元素后移,导致元素被移动多次才能到达正确的位置,因此时间复杂度不理想。
- 考虑到需要移动元素位置,因此使用了双指针法,使得每次只需要移动一次就可以将一个元素移动到正确位置,大大降低了时间复杂度。