当前位置:网站首页>leetcode:151. 颠倒字符串中的单词
leetcode:151. 颠倒字符串中的单词
2022-08-03 02:04:00 【OceanStar的学习笔记】
题目来源
题目描述
题目解析
进阶要求(原地 解法)
不能使用辅助空间之后,那么只能在原字符串上下功夫了。
思路:源字符串为:"the sky is blue "
- 移除多余空格:“the sky is blue”
- 字符串反转:“eulb si yks eht”
- 单词反转:“blue is sky the”
class Solution {
public:
//反转字符串
void reverse(string& s,int start,int end){
while(start<end){
swap(s[start++],s[end--]);
}
}
//移除多余空格,利用快慢指针
void removeExtraSpaces(string&s){
int slow=0,fast=0;
//移除开始位置的空格
while(s[fast]==' '){
fast++;
}
//移除中间位置多余的空格
while(fast<s.size()){
if(fast>0 && s[fast]==' ' &&s[fast-1]==' '){
fast++;
}
else{
s[slow]=s[fast];
slow++;
fast++;
}
}
//如果末尾仅有一个空格,则上述无法将该空格移除;如果末尾有很多空格,则上述将保留一个空格,也不符合要求;所以最终可能的情况有二:末尾有一个空格/末尾无空格
if(slow-1>0 && s[slow-1]==' '){
slow--;
}
s.resize(slow);
}
string reverseWords(string s) {
//step1.移除多余空格
removeExtraSpaces(s);
//step2.反转整个字符串
reverse(s,0,s.size()-1);
//step3.依次反转每个单词
int start=0;
for(int i=0;i<s.size();i++){
if(s[i]==' '){
reverse(s,start,i-1);
start=i+1;
}
if(i==s.size()-1){
reverse(s,start,i);
}
}
return s;
}
}
API
class Solution {
public:
string reverseWords(string s) {
istringstream sin(s);
string ans, word;
while(sin>>word){
ans = " " + word + ans;
}
return ans.substr(1, ans.size()-1);
}
};
一次遍历(辅助空间)
class Solution {
public:
string reverseWords(string s) {
if(s.empty()){
return "";
}
int L = 0, R = s.size() - 1;
std::string ans;
while (L <= R){
while (L <= R && s[L] == ' '){
L++;
}
int start = L;
while (L <= R && s[L] != ' '){
L++;
}
int len = L - start; // 'a '
if(len != 0){
std::string tmp = s.substr(start, len);
ans = ans.empty() ? tmp : tmp + " " + ans;
}
}
return ans;
}
};
边栏推荐
猜你喜欢
The cornerstone of high concurrency: multithreading, daemon threading, thread safety, thread synchronization, mutual exclusion lock, all in one article!...
Summary of some interviews
OpenWRT setup ipv6 network
QWidget、QPushButton、
.NET in-depth analysis of the LINQ framework (four: IQueryable, IQueryProvider interface details)
征集 |《新程序员》专访“Apache之父”Brian Behlendorf,你最想问什么?
Topic Modeling of Short Texts: A Pseudo-Document View
WordPress博客问答小插件
Jenkins2.328+sonarqube7.9 实现代码自动化检测
二叉树的前序遍历、中序遍历、后序遍历和层序遍历
随机推荐
梅科尔工作室-14天华为培训三
kubernetes部署ldap
Rust Web(三)—— 通过sqlx连接数据库(MySQL)
超级复杂可贴图布局的初级智能文本提示器
为什么要使用 playwright 做浏览器自动化测试?
有趣简单的M2处理器性能实验:Swift与C代码执行速度的比较
Summary of some interviews
实现统一账号登录,sonarqube集成ldap
ES6 新特性:Class 的基本语法
二叉树的前序遍历、中序遍历、后序遍历和层序遍历
46LVS+Keepalived群集
常用工具链和虚拟环境-msys2与mingw
Excel 如何比较两列字符串是否相同?
The LVS load balancing cluster and the deployment of the LVS - NAT experiment
能添加任意贴图超级复布局的初级智能文本提示器
豆瓣评分9.3的好书,文末给大家抽奖送几本!
Kook机器人开发日志01
QT添加资源文件、样式表、qss文件使用
公司代码学习笔记
vs studio 安装opencv 环境