【LeetCode每日一题】2047:句子中的有效单词数

114 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第17天,点击查看活动详情

LeetCode每日一题打卡专栏正式启动!不出意外将日更LeetCode的每日一题,敬请期待。

2047:句子中的有效单词数

题意

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

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

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

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

提示:

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

示例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" 不是有效单词,因为它含有数字

示例4:

输入:sentence = "he bought 2 pencils, 3 erasers, and 1 pencil-sharpener." 输出:6 解释:句子中的有效单词是 "he"、"bought"、"pencils,"、"erasers,"、"and" 和 "pencil-sharpener."

题解

直接模拟即可。首先分割出子字符串,然后不是token的情况为:

  • 连字符最多一个
  • 连字符左右两边必须是字母
  • 连字符不能在字符串首尾
  • 不能有数字
  • 最多一个标点符号且位于末尾

C++代码:

class Solution {
public:
    int check(string s){
        int n=s.length();
        if(n==0) return 0;
        int cnt=0;
        for(int i=0;i<n;i++){
            if(s[i]=='-'){
                if(cnt==1) return 0;
                cnt=1;
                if(i==0||i==n-1) return 0;
                if(!(s[i-1]>='a'&&s[i-1]<='z')||!(s[i+1]>='a'&&s[i+1]<='z')) return 0;
            }else if((s[i]=='!'||s[i]==','||s[i]=='.')&&i!=(n-1)) return 0;
            else if(s[i]>='0'&&s[i]<='9') return 0;
        }
        return 1;
    }
    int countValidWords(string sentence) {
        int l=0,r=0,len=sentence.length();
        string s;
        int ans=0,flag=0;
        for(int i=0;i<len;i++){
            if(sentence[i]==' '){
                flag=1;
                r=i-1;
                if(l>r){
                    l=i+1;continue;
                }
                s=sentence.substr(l,r-l+1);
                // cout<<s<<endl;
                if(check(s)) ans++;
                l=i+1;
            }
        }
        //最后一个
        if(flag) s=sentence.substr(l,r-l+1);
        else s=sentence.substr(l,len);
        // cout<<s<<endl;
        if(check(s)) ans++;
        return ans;
    }
};

Java代码:

class Solution {
    boolean check(String s) {
        char[] ss = s.toCharArray();
        int n = s.length();
        int cnt=0;
        for (int i = 0; i < n; i++) {
            if (ss[i] == '-') {
                if(cnt==1) return false;
                cnt=1;
                if (i == 0 || i == n - 1) {
                    return false;
                } else if (!(ss[i - 1] >= 'a' && ss[i - 1] <= 'z') || !(ss[i + 1] >= 'a' && ss[i + 1] <= 'z')) {
                    return false;
                }
            } else if (ss[i] >= '0' && ss[i] <= '9') {
                return false;
            }else if((ss[i]=='!'||ss[i]=='.'||ss[i]==',')&&i!=n-1){
                return false;
            }
        }
        return true;
    }
​
    public int countValidWords(String sentence) {
        int ans = 0;
        String s[] = sentence.split(" ");
        for (String str : s) {
            // System.out.println(str + " " + str.length());
            if (str.length() == 0)
                continue;
            if (check(str))
                ans++;
        }
        return ans;
    }
}