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

本文介绍了多个关于字符串处理的编程问题,包括找到最后一个单词的长度、计算字符串中单词的数量、检查数字序列是否递增、识别有效单词以及截断句子等。通过示例代码展示了如何在C语言中解决这些问题,涉及字符串遍历、字符判断和算法应用。
摘要由CSDN通过智能技术生成

前言

原文章可参考:《算法零基础100讲》第23讲

58. 最后一个单词的长度

原题链接:58. 最后一个单词的长度

在这里插入图片描述

代码

因为要求最后一个单词长度,所以从后往前遍历字符串,遇到不是空格的就计数;如果遇到了空格,就退出。

int lengthOfLastWord(char * s)
{
    int len_word = 0;

    for (int i = strlen(s) - 1; i >= 0; --i)
    {
        if (s[i] != ' ')
        len_word++;
        if (s[i] == ' ' && len_word != 0)
        {
            break;
        }
    }

    return len_word;
}

434. 字符串中的单词数

原题链接:434. 字符串中的单词数

在这里插入图片描述

代码

int countSegments(char * s)
{
    if (NULL == s || s[0] == '\0')
        return 0;
    int count = 0;

    for (int i = 0; i < strlen(s); ++i)
    {
        if ((i == 0 || s[i - 1] == ' ') && s[i] != ' ')
        {
            count++;
        }
    }

    return count;
}

2042. 检查句子中的数字是否递增

原题链接:2042. 检查句子中的数字是否递增

在这里插入图片描述

代码

先将字符串中的数字都提取出来,再遍历比较。

bool areNumbersAscending(char * s)
{
    int ans[200];

    int ansSize = 0;

    for (int i = 0; i < strlen(s); ++i)
    {
        if (isdigit(s[i]))
        {
            int num = 0;
            while (i < strlen(s) && isdigit(s[i]))
            {
                num = num * 10 + (s[i] - '0');
                ++i;
            }
            ans[ansSize++] = num;
        }
    }

    for (int i = 0; i < ansSize - 1; ++i)
    {
        //printf("%4d", ans[i]);
        if (ans[i] >= ans[i + 1])
            return false;
    }
    return true;
}

2047. 句子中的有效单词数

原题链接:2047. 句子中的有效单词数

在这里插入图片描述

代码

//判断符号
bool Is_symbol(char c)
{
    return (c == '!' || c == '.' || c == ',');
}

//判断数字
bool Is_digit(char c)
{
    return (c >= '0' && c <= '9');
}

//判断小写字母
bool Is_alpha(char c)
{
    return (c >= 'a' && c <= 'z');
}

//判断单词
bool Is_word(char* s)
{
    int hyphen = 0, symbol = 0;

    for (int i = 0; i < strlen(s); ++i)
    {
        if (Is_digit(s[i]))
            return false;
        
        if (s[i] == '-')
        {
            if (i - 1 >= 0 && Is_alpha(s[i - 1]) && i + 1 < strlen(s) && Is_alpha(s[i + 1]))
                hyphen++;
            else
            {
                return false;
            }
        }

        if (Is_symbol(s[i]))
        {
            symbol++;
            if (i != strlen(s) - 1)
                return false;
        }

        if (hyphen > 1 || symbol > 1)
            return false;        
    }

    return true;
}

int countValidWords(char * sentence)
{
    if (NULL == sentence) return 0;

    int count = 0;
    char* token = NULL;
    token = strtok(sentence, " ");

    while (token != NULL)
    {
        if (Is_word(token))
        {
            count++;
        }

        token = strtok(NULL, " ");
    }

    return count;
}

1816. 截断句子

原题链接:1816. 截断句子

在这里插入图片描述

代码

从后往前搞,很妙。

//很妙的方法

char * truncateSentence(char * s, int k)
{
    if (NULL == s) return NULL;
    char* p = s;

    while (*p++)
    {
        if (*p == ' ' && --k == 0)
        {
            *p = '\0';
            return s;
        }
    }

    return s;
}

1784. 检查二进制字符串字段

原题链接:1784. 检查二进制字符串字段

在这里插入图片描述

代码

这个题刚开始没看懂题意,导致提交了好多次才通过。。

其实题意就是不能有 “01” 这种组合。。

bool checkOnesSegment(char * s)
{
    if (NULL == s) return false;

    if (strlen(s) == 1 && s[0] == '1')
        return true;
    
    
    for (int i = 0; i < strlen(s); ++i)
    {
        if (s[i] == '0' && s[i + 1] == '1')
        {
            return false;
        }
    }
    return true;
}

练习题

468. 验证IP地址

原题链接:468. 验证IP地址

在这里插入图片描述

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

_索伦

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

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

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

打赏作者

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

抵扣说明:

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

余额充值