2047. 句子中的有效单词数

264 阅读1分钟

「这是我参与2022首次更文挑战的第9天,活动详情查看:2022首次更文挑战」。

题目描述

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

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

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

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

思路分析

首先使用空格将元素分割,然后逐个判断是否是有效单词。

对于每一个单词,判断是否是空(两个空格连在一起可能造成的问题)

对于每个单词,如果标点符号不再末尾,无效,如果标点符号超过一个,无效。

如果连字符在末尾或者开头,无效,如果超过一个,无效。

具体实现

class Solution {
public:
    int countValidWords(string sentence) {
        vector<string> arr;
        SplitString(sentence, arr, " ");
        int manlen = 0, henglen = 0;
        int ret = 0;

        bool flag = true;
        for(auto t: arr){
            //对于每个字符串
            // cout << t << endl;
            if(t.size() == 0){
                continue;
            }
            for(int i = 0; i < t.size(); i++){
               
                if(t[i] == '-'){
                    if (i == 0 || i == t.size() - 1){
                       flag = false;
                        break;
                    }
                    if (!(isZiMu(t[i - 1]) && isZiMu(t[i+1]))){
                         flag = false;
                        break;    
                    }
                    henglen ++;
                    if (henglen == 2){
                         flag = false;
                        break;
                    }
                }else if (t[i] == '!' || t[i] == '.' || t[i] == ','){
                    if(i != t.size() - 1){
                         flag = false;break;
                    }
                    manlen++;
                    if (manlen == 2){
                        flag = false;
                        break;
                    }
                // }else if (!((t[i] >= 'a'&& t[i] <= 'z') || (t[i] >= '0' && t[i] <= '9'))){
                    }else if (!((t[i] >= 'a'&& t[i] <= 'z') )){
                     flag = false;
                        break;
                }
            }
            henglen = 0, manlen = 0;
            if(flag)ret++;
            flag = true;
        }
        return ret;
        
    }
    bool isZiMu(char c){
        if (c >= 'a' && c <= 'z')return true;
        return false;
    }
    void SplitString(const std::string& s, std::vector<std::string>& v, const std::string& c)
};

总结

splitstring是在网上找的实现,这里就不贴了