2047. 句子中的有效单词数

该问题主要涉及字符串处理和正则表达式的应用。给定一个句子,任务是计算其中有效单词的数量。有效单词必须遵循特定规则,如只包含小写字母、连字符和/或标点符号,且限制连字符和标点符号的数量。提供的代码中,定义了一个解决方案,通过遍历句子中的每个token,检查它们是否符合有效单词的条件。最后返回有效单词的总数。

题目描述

句子仅由小写字母(‘a’ 到 ‘z’)、数字(‘0’ 到 ‘9’)、连字符(‘-’)、标点符号(‘!’、‘.’ 和 ‘,’)以及空格(’ ')组成。每个句子可以根据空格分解成 一个或者多个 token ,这些 token 之间由一个或者多个空格 ’ ’ 分隔。

如果一个 token 同时满足下述条件,则认为这个 token 是一个有效单词:

仅由小写字母、连字符和/或标点(不含数字)组成。
至多一个 连字符 ‘-’ 。如果存在,连字符两侧应当都存在小写字母(“a-b” 是一个有效单词,但 “-ab” 和 “ab-” 不是有效单词)。
至多一个 标点符号。如果存在,标点符号应当位于 token 的 末尾 。
这里给出几个有效单词的例子:“a-b.”、“afad”、“ba-c”、“a!” 和 “!” 。

给你一个字符串 sentence ,请你找出并返回 sentence 中 有效单词的数目 。

示例 1:

输入:sentence = "cat and  dog"
输出:3
解释:句子中的有效单词是 "cat"、"and" 和 "dog"

示例 2:

输入:sentence = "!this  1-s b8d!"
输出:0
解释:句子中没有有效单词
"!this" 不是有效单词,因为它以一个标点开头
"1-s" 和 "b8d" 也不是有效单词,因为它们都包含数字

示例 3:

输入:sentence = "alice and  bob are playing stone-game10"
输出:5
解释:句子中的有效单词是 "alice"、"and"、"bob"、"are" 和 "playing"
"stone-game10" 不是有效单词,因为它含有数字

提示:

1 <= sentence.length <= 1000
sentence 由小写英文字母、数字(0-9)、以及字符(’ ‘、’-‘、’!‘、’.’ 和 ‘,’)组成
句子中至少有 1 个 token

#define pb push_back
class Solution {
public:
    vector<string> words;
    int countValidWords(string sentence) {
        int n = (int)sentence.size();
        
        for(int i = 0; i < n; i ++) {
            string s;
            int j = i;
            
            while(j < n && sentence[j] != ' ') {
                s += sentence[j];
                j ++;
            }

            if(s != "") words.pb(s);

            i = j;
        }

        int ans = 0;
        for(auto u : words)
            if(check(u)) ans ++;

        return ans;
    }

    bool check(string s) {
        int lowernum = 0, lzf = 0, bd = 0;
        for(int i = 0; i < s.size(); i ++) {
            if(s[i] >= 'a' && s[i] <= 'z') lowernum ++;
            else if(s[i] == '-') lzf ++;
            else if(s[i] == '.' || s[i] == '!' || s[i] == ',') bd ++;
            else return false;
        }

        int len = (int)s.size();
        if(lzf > 1 || bd > 1) return false;
        else {
            if(bd == 1 && ! judge(s[len - 1])) return false;
            else if(lzf == 1) {
                int index;
                
                for(int i = 0; i < s.size(); i ++) {
                    if(s[i] == '-') {
                        index = i;
                        break;
                    }
                }

                bool flag1 = false, flag2= false;
                for(int i = 0; i < index; i ++) {
                    if(s[i] >= 'a' && s[i] <= 'z') {
                        flag1 = true;
                        break;
                    }
                }

                for(int i = index + 1; i < s.size(); i ++) {
                    if(s[i] >= 'a' && s[i] <= 'z') {
                        flag2 = true;
                        break;
                    }
                }

                if(! flag1 || ! flag2) return false;
                else return true;
            } else return true;
        }
    }

    bool judge(char ch) {
        if(ch == '.' || ch == ',' || ch == '!') return true;
        else return false;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值