文章目录
本题可参考以下博客:
char*和string的相互转化
strtok()函数的用法
STL-string 使用find() substr()等函数实现复杂分割字符串的功能对标java的split API
Leetcode151
1.问题描述
2.解决方案
重要步骤:去重冗余空格操作
1.使用string库函数erase()直接移除
逻辑很简单就遇见多余空格就移除,但是移除函数最快,自己实现用双指针也得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 && fastIndex<s.size()&&s[fastIndex]==' '){
fastIndex++;
}
//3.去掉字符串中间部分的冗余空格
for (;fastIndex<s.size();fastIndex++) {
//最妙的地方!!!!!!!
//遇到中间多余的空格(从第二个空格开始算多余的),直接略过,如果是第一个空格或者字母直接赋值给慢指针
if (fastIndex-1>0 && 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); // 重新设置字符串大小
}
}
解法一:不使用辅助空间
提升难度:不要使用辅助空间,空间复杂度要求为O(1)。
class Solution1 {
public:
//反转字符串s中左闭又闭的区间[start, end]
void reverse(string& s, int start, int end) {
for (int i = start, j = end; i < j; i++, j--) {
swap(s[i], s[j]);
}
}
void removeExtraSpaces_low(string& s) {