- 1.问题描述
- 2.解决方案
- 方法一:使用string库函数完成
- 第一步:去重冗余空格操作
- 1.使用string库函数erase()直接移除
- 2.使用双指针
- 第二步:将标准的字符串进行分割
- 第三步:合起来看效果
- 方法二:使用string和char[]互相转化加char[]库函数strtok()一步完成
1.问题描述
分割字符串这种操作在java中其实是有API直接调用的,但是在C++中没有,今天就来分析实现一个可以去除冗余空格并且分割字符串的可复用的函数!
使用STL进行字符串分割涉及到string类的两个函数find和substr:
1、find函数
原型:size_t find (const string& str, size_t pos = 0) const;
功能:查找子字符串第一次出现的位置。
参数说明:str为子字符串,pos为初始查找位置。
返回值:如果是字串返回第一次出现的位置,如果不是返回string::npos(为-1或者4294967295都算对!!!!!!!!!!)
2、substr函数(左起始,右长度)
原型:string substr (size_t pos = 0, size_t n = npos) const;
功能:获得子字符串。
参数说明:pos为起始位置(默认为0),n为要截取字符串的长度
返回值:一个子字符串,从其指定的位置开始
备注:如果没有指定长度_Count或_Count+_Off超出了源字符串的长度,则子字符串将延续到源字符串的结尾
逻辑很简单就遇见多余空格就移除,但是移除函数最快,自己实现用双指针也得o(n)27. 移除元素,那么整体代码就是o(n^2)了很慢
void removeExtraSpaces_low(string& s) {
//1.删除中间的空格
for(int i=s.size()-1;i>0;i--) {
if (s[i]==s[i - 1]&&s[i]==' ') {
s.erase(s.begin() + i);
}
}
//2.删除字符串最后面的空格
if (s.size() > 0 && s[s.size() - 1] == ' ') {
s.erase(s.begin() + s.size() - 1);
}
//3.删除字符串最前面的空格
if (s.size() > 0 && s[0] == ' ') {
s.erase(s.begin());
}
}
2.使用双指针
1.使用双指针法来去移除空格,最后resize(重新设置)一下字符串的大小,就可以做到O(n)的时间复杂度。
2.fastIndex走的快,slowIndex走的慢,最后slowIndex就标记着移除多余空格后新字符串的长度。
3.其实就是一个字符串有很多没用的字符,fastIndex在前面进行筛选正确的字符就赋给slowIndex,错误的fastIndex就直接略过,所以最后slowIndex走过的就是真正的目标字符串!
//移除冗余空格:使用双指针(快慢指针法) O(n)的算法
//去掉冗余空格 " This is a sentence with 7 tokens " --变为-->"This is a sentence with 7 tokens"
void removeExtraSpaces(string& s) {
//1.定义快指针,慢指针
int slowIndex=0, fastIndex=0;
//2.去掉字符串前面的空格
while (s.size() > 0 && fastIndex0 && s[fastIndex-1]==s[fastIndex] && s[fastIndex]==' '){
continue;
}else{
s[slowIndex++]=s[fastIndex];
}
}
//4.去掉字符串末尾的空格,因为如果字符串原本最后有很多空格,第一个空格是会被记录到slowIndex中的,所以要清楚一下
if(slowIndex-1> 0 && s[slowIndex-1]==' ') {
s.resize(slowIndex - 1);
} else {
s.resize(slowIndex); // 重新设置字符串大小
}
}
//"This is a sentence with 7 tokens" //input 输入的字符串 //c 分割符 //segment 输出分割字符片段(集) bool strSegmentation(string input,char c,vector& segment){ if(input.size()==0) return false; while(1){ int index=input.find(c); if(index==-1){ segment.push_back(input); break; } else{ string str=input.substr(0,index); input.erase(0,index+1); segment.push_back(str); } } if(segment.size() == 0) return false; else return true; }
#include#include #include



