O(n)时间原地删除指定字符串中的指定字符
来源:互联网 发布:香港研究生网络面试 编辑:程序博客网 时间:2024/06/05 17:26
声明: 原创作品,转载请注明出处!
问题:实现一个函数,要求将一个字符串里面的指定字符全部删除,最后返回经过修改后的字符串,要求不能调用任何其他C语言运行时函数,并且复杂度尽可能的低。
给定函数如下:(ch是指定被删除的字符)
char *delete_all(const char charset, char *str){ /* write code here */}
基本思路:
首先考虑用最简单的方式,设置两个指针s和q,s指向str的第一个位置,q指向一块新的空间,用以保存经删除指定字符后的字符串。那么,代码应该是这样的:
char *delete_all(const char ch, char *str){ char* s = str; char* q; char* new_str; if(str == NULL){ return str; } new_str = (char*) malloc(strlen(str)+1); q = new_str; while(*q = *s++){ if(q != ch){ ++q; } } strcpy(str, new_str); free(new_str); return str;}
虽然时间复杂度为O(n),但是,上述代码的实现使用了C运行时函数,不符合题意。
仔细分析可以发现,s向前前进的步数 >= q向前移动的步数,如果将s和q指向同一块区域(因为修改后的字符串影响不到s指向的剩余未被处理的字符串),每次一步往前扫描并将遇到的字符ch赋给q当前指向的地址,如果ch为需要删除的字符,那么q就不动,如果不是要删除的字符,q就前进一步。那么,当扫描一遍后,得到的字符串就是删除了指定字符后的字符串了。
因此,有如下的代码:
char* delete_all(const char ch, char* str){ if(str == NULL){ return str; } char* s = str; char* q = str; while(*q = *s++){ if(q != ch){ ++q; } } return str;}
很显然时间复杂度为 O(n),空间复杂度为O(1)。
- O(n)时间原地删除指定字符串中的指定字符
- 删除字符串中的指定字符
- 删除字符串中的指定字符
- 删除字符串中的指定字符
- 删除字符串中的指定字符
- 删除字符串中的指定字符
- 删除字符串指定字符
- 字符串删除指定字符
- java删除字符串中的指定字符
- java删除字符串中的指定字符 .
- 删除一个字符串中的指定字符
- 删除字符串中的指定字符(23)
- Java删除字符串中的指定字符
- 从指定字符串中删除指定字符
- 从指定字符串删除指定字符
- C语言删除字符串中的指定字符,字符串连接
- 字符串处理 删除指定字符
- 字符串删除指定字符算法
- 从决策树学习谈到贝叶斯分类算法、EM、HMM
- 提醒自己: 别陷太深
- [cocos2d-x] --- 虚拟机下完美搭建ios - cocos2d-x开发环境
- 开源C,C++搜索引擎列表
- 【字符串_AC自动机专辑】
- O(n)时间原地删除指定字符串中的指定字符
- CDN采用的关键技术
- SVM工具箱快速入手简易教程
- c++中 rand函数和srand函数的用法和区别
- LightOJ 1333 结构体排序
- 你所不知道的main函数
- Baidu Astar Contest 2013-04-13 Regional (Guangzhou)
- 解决异常“android.view.InflateException: Binary XML file line # : Error inflating class”
- 《Cstyle的UEFI导读》系列专题博客