文章目录
写在前面
一个分割字符串常用的小技巧:我们可以在字符串的最后一个位置加上一个分隔符,这样就不用特判最后一个分割出来的串
58. 最后一个单词的长度
大致思路
既然是要找最后一个单词,那么我们就可以直接把字符串反转过来。从前往后遍历一遍,找到空格以后返回遍历过的长度。如果找不到空格,返回字符串长度。
错误实现
将上面的思路直接实现,但是提交以后发现居然还有最后一个字符是空格这样的诡异字符串
class Solution {
public:
int lengthOfLastWord(string s) {
reverse(s.begin(),s.end());
int n=s.size();
for(int i=0;i<n;i++)
if(s[i]==' ') return i;
return n;
}
};
正确实现
根据上面的错误情况,我们知道遍历的起点不能是0而应该是字符串(反转后的)中第一个不是空格的位置
class Solution {
public:
int lengthOfLastWord(string s) {
reverse(s.begin(),s.end());
int n=s.size();
int flag=0;
while(s[flag]==' ') flag++;
for(int i=flag;i<n;i++)
if(s[i]==' ') return i-flag;
return n-flag;
}
};
434. 字符串中的单词数
暴力枚举
暴力枚举一遍字符串,找到单词的条件是当前位置是空格且前一个位置不是空格
class Solution {
public:
int countSegments(string s) {
int n=s.size(),cnt=0;
s+=' ';
for(int i=1;i<=n;i++)
if(s[i]==' '&&s[i-1]!=' ') cnt++;
return cnt;
}
};
2042. 检查句子中的数字是否递增
分割字符串
遍历字符串,以空格为分割把一个字符串分成几段。把其中是数字的段挑出来,放到一个数组里,然后遍历数组,如果不是单调递增返回false
class Solution {
public:
bool areNumbersAscending(string s) {
int n=s.size();
s+=' ';
string ch;
vector<int>res;
for(int i=0;i<=n;i++)
{
if(s[i]!=' ') ch+=s[i];
else
{
if(ch[0]>='0'&&ch[0]<='9') res.push_back(stoi(ch));
ch.clear();
}
}
for(int i=1;i<res.size();i++)
{
if(res[i]<=res[i-1]) return false;
}
return true;
}
};
2047. 句子中的有效单词数
模拟
依据题意进行模拟判断每一个条件
class Solution {
bool check(string ch)
{
if(ch.size()==0) return false;
int flag=0,cnt=0;
for(int i=0;i<ch.size();i++)
{
if(ch[i]>='a'&&ch[i]<='z') flag=1;
else if(ch[i]>='0'&&ch[i]<='9') return false;
else if(ch[i]=='-')
{
if(cnt>0) return false;
if(flag)
{
int cnt=0;
for(int j=i+1;j<ch.size();j++)
{
if(ch[j]>='a'&&ch[j]<='z')
{
cnt=1;
break;
}
}
if(!cnt) return false;
}
else return false;
cnt++;
}
else if(ch[i]=='!'||ch[i]=='.'||ch[i]==',')
{
if(i!=ch.size()-1) return false;
}
}
return true;
}
public:
int countValidWords(string sentence) {
vector<string>res;
string ch;
sentence+=' ';
for(int i=0;i<sentence.size();i++)
{
if(sentence[i]!=' ') ch+=sentence[i];
else
{
if(check(ch)) res.push_back(ch);
ch.clear();
}
}
return res.size();
}
};
1816. 截断句子
对空格计数
枚举字符串的每一个字符,如果是空格就给cnt加一,如果cnt等于所给数,返回字符串的前半段
class Solution {
public:
string truncateSentence(string s, int k) {
int cnt=0;
s+=' ';
for(int i=0;i<s.size();i++)
{
if(s[i]==' ') cnt++;
if(cnt==k) return s.substr(0,i);
}
return 0;
}
};
1784. 检查二进制字符串字段
暴力循环
class Solution {
public:
bool checkOnesSegment(string s) {
int cnt=0,res=0;
for(auto t:s)
{
if(t=='0')
{
if(cnt) res++;
cnt=0;
}
else cnt++;
}
if(cnt) res++;
return res==0||res==1;
}
};