[题解] 《算法零基础100讲》(第23讲) 字符串算法(三) - 字符串分割

写在前面

一个分割字符串常用的小技巧:我们可以在字符串的最后一个位置加上一个分隔符,这样就不用特判最后一个分割出来的串

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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学习算法的小菜鸡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值