字符串处理-----从一个字符串中删…

好吧,博主又来了。今天给大家带来的同样的是恶心的字符串处理。今天给大家带来的问题是:从一个字符串中删除指定的字符。和上一篇博客相比,除了处理问题不同之外,恶心程度还是一样的。一旦处理不好的话,必然会被老板喷的连妈妈都不认识的说。
问题举例: 现有字符串"xiaozuonanjing",指定字符"zuo",那么完成删除之后得到的字符串应该是"xiananjing"。
好吧,其实这个问题想起来也是很简单嘛,把这个string每个字符与指定字符进行比较,然后再把指定的删除就可以了。但是这么做其实很傻,因为操作起来真心的是挺麻烦的。
首先算法复杂度问题就是大问题,n个字符串然后指定字符串m个,那么光是比较就是o(m*n),且不说你对于每一次删除都需要申请新的地址进行拷贝了。
所以说这个问题看起来貌似很简单,但是真心还是一个大坑。
我这里还是给大家举出一个我自己稍微改进的方法,大家可以慢慢瞧一瞧。
// blog_remove_chars.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include
#include
#include
using namespace std;
//第一种方法就是之前说的方法,算法复杂度极高。
bool delete_chars_method1(string& str, string& remove_str)
{
size_t const length=str.length();//这里用的是string,得到string的长度
//string::iterator iter=str.begin();
for(string::iterator iter=str.begin();iter!=str.end();++iter)//这个是迭代器最常用的迭代,如果读者对stl稍微熟悉的话这个应该看过不少,其实就是迭代遍历
{
if(remove_str.find(*iter)!=string::npos)//每个字符都进行查找,使用find函数
{
str.erase(iter);//释放变量
iter=str.begin();//这里是大家非常容易忽略的地方,对于所有的容器如果容器内容被删除或者插入新的数据,那么必须要更新迭代器位置。读者如果不信的话可以试着把这句话注销然后再跑一次程序。
}
}
return true;
}
//这里是我稍微改进的方法,算法复杂度是o(m+n)
bool delete_chars_method2(string& str, string& remove_str)
{
const size_t str_length=str.size();
const size_t remove_length=remove_str.size();
char *charac_str=nullptr;
try{
charac_str=new char[str_length];//这里用try,catch和nullptr的原因我不想再累述
}
catch (exception &e)
{

cout<<e.what()<<endl;
if(charac_str!=nullptr) delete charac_str;
return false;
}
bool charac_flag[26];//定义26个字符,这样的话就可以迅速知道哪些是已经被标记需要删除了。不然的话,如果指定字符是”aaaaaaa“,用上面的方法就等哭上一阵子了
fill_n(charac_flag,26,false);//fill_n用来填充一段连续内存
for(size_t pos=0;pos
{
charac_flag[remove_str[pos]-'a']=true;//如果指定字符中含有对应的位置,就将对应的位置进行标记
}
size_t new_size=0;
for(int tempi=0;tempi
{
if(!charac_flag[str[tempi]-'a'])
{
*(charac_str+new_size)=str[tempi];//对现有字符进行遍历,如果其中的字符被标记过就将这个字符拷贝到新的字符串
++new_size;
}
}
str=string(charac_str,new_size);//将内容拷贝到原有的字符串中
delete []charac_str;//要将堆区的数组删除,这里注意删除堆区数组的方式和删除单个对象的区别
return true;
}
int main()
{
string str="xiaozuonanjing";
string remove_str="zuo";
if(delete_chars_method1(str,remove_str))cout<<str<<endl;

str="xiaozuonanjing";
if(delete_chars_method2(str,remove_str))cout<<str<<endl;
return 0;
}
运行结果:
字符串处理-----从一个字符串中删除字符


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值