Welcome to Subscribe On Youtube

Formatted question description: https://leetcode.ca/all/2047.html

2047. Number of Valid Words in a Sentence (Easy)

A sentence consists of lowercase letters ('a' to 'z'), digits ('0' to '9'), hyphens ('-'), punctuation marks ('!', '.', and ','), and spaces (' ') only. Each sentence can be broken down into one or more tokens separated by one or more spaces ' '.

A token is a valid word if:

  • It only contains lowercase letters, hyphens, and/or punctuation (no digits).
  • There is at most one hyphen '-'. If present, it should be surrounded by lowercase characters ("a-b" is valid, but "-ab" and "ab-" are not valid).
  • There is at most one punctuation mark. If present, it should be at the end of the token.

Examples of valid words include "a-b.", "afad", "ba-c", "a!", and "!".

Given a string sentence, return the number of valid words in sentence.

 

Example 1:

Input: sentence = "cat and  dog"
Output: 3
Explanation: The valid words in the sentence are "cat", "and", and "dog".

Example 2:

Input: sentence = "!this  1-s b8d!"
Output: 0
Explanation: There are no valid words in the sentence.
"!this" is invalid because it starts with a punctuation mark.
"1-s" and "b8d" are invalid because they contain digits.

Example 3:

Input: sentence = "alice and  bob are playing stone-game10"
Output: 5
Explanation: The valid words in the sentence are "alice", "and", "bob", "are", and "playing".
"stone-game10" is invalid because it contains digits.

Example 4:

Input: sentence = "he bought 2 pencils, 3 erasers, and 1  pencil-sharpener."
Output: 6
Explanation: The valid words in the sentence are "he", "bought", "pencils,", "erasers,", "and", and "pencil-sharpener.".

 

Constraints:

  • 1 <= sentence.length <= 1000
  • sentence only contains lowercase English letters, digits, ' ', '-', '!', '.', and ','.
  • There will be at least 1 token.

Solution 1. Brute Force

  • // OJ: https://leetcode.com/problems/number-of-valid-words-in-a-sentence/
    // Time: O(N)
    // Space: O(N)
    class Solution {
        bool valid(string &s) {
            int hyphen = 0, N = s.size();
            for (int i = 0; i < N; ++i) {
                if (isdigit(s[i])) return false; // no digit
                if (isalpha(s[i])) continue; // skip letters
                if (s[i] == '-') {
                    if (++hyphen > 1) return false; // at most one hyphen allowed
                    if (i - 1 < 0 || !isalpha(s[i - 1]) || i + 1 >= N || !isalpha(s[i + 1])) return false; // hyphen must be surrounded by letters
                } else if (i != N - 1) return false; // punctuation, if any, must be the last character of token
            }
            return true;
        }
    public:
        int countValidWords(string s) {
            string w;
            istringstream ss(s);
            int ans = 0;
            while (ss >> w) ans += valid(w);
            return ans;
        }
    };
    
  • class Solution:
        def countValidWords(self, sentence: str) -> int:
            def check(token):
                hyphen = False
                for i, c in enumerate(token):
                    if c.isdigit() or (c in '!.,' and i < len(token) - 1):
                        return False
                    if c == '-':
                        if (
                            hyphen
                            or i == 0
                            or i == len(token) - 1
                            or not token[i - 1].islower()
                            or not token[i + 1].islower()
                        ):
                            return False
                        hyphen = True
                return True
    
            return sum(check(token) for token in sentence.split())
    
    ############
    
    # 2047. Number of Valid Words in a Sentence
    # https://leetcode.com/problems/number-of-valid-words-in-a-sentence
    
    class Solution:
        def countValidWords(self, sentence: str) -> int:
            res = 0
            
            for s in sentence.split():
                if any(i in s for i in '0123456789'):
                    continue
                if s.count('-') > 1 or s[0] == '-' or s[-1] == '-':
                    continue
                if '-' in s:
                    x = s.index('-')
                    if not s[x-1].isalpha() or not s[x+1].isalpha():
                        continue
                if sum(i in '!.,' for i in s) > 1:
                    continue
                if any(i in '!.,' for i in s[:-1]):
                    continue
                res += 1
                
            return res
    
    
  • class Solution {
        public int countValidWords(String sentence) {
            int ans = 0;
            for (String token : sentence.split(" ")) {
                if (check(token)) {
                    ++ans;
                }
            }
            return ans;
        }
    
        private boolean check(String token) {
            int n = token.length();
            if (n == 0) {
                return false;
            }
            boolean hyphen = false;
            for (int i = 0; i < n; ++i) {
                char c = token.charAt(i);
                if (Character.isDigit(c) || (i < n - 1 && (c == '!' || c == '.' || c == ','))) {
                    return false;
                }
                if (c == '-') {
                    if (hyphen || i == 0 || i == n - 1 || !Character.isLetter(token.charAt(i - 1))
                        || !Character.isLetter(token.charAt(i + 1))) {
                        return false;
                    }
                    hyphen = true;
                }
            }
            return true;
        }
    }
    
  • function countValidWords(sentence: string): number {
        let words = sentence.trim().split(/\s+/);
        let ans = 0;
        for (let word of words) {
            if (isValied(word)) {
                ans++;
            }
        }
        return ans;
    }
    
    function isValied(str: string): boolean {
        let n = str.length;
        let hasLine = false;
        for (let i = 0; i < n; i++) {
            const char = str.charAt(i);
            if (/^[0-9]$/.test(char)) {
                return false;
            }
            if (char == '-') {
                if (hasLine) return false;
                else {
                    hasLine = true;
                }
                let pre = str.charAt(i - 1),
                    post = str.charAt(i + 1);
                if (!/^[a-z]$/g.test(pre) || !/^[a-z]$/g.test(post)) {
                    return false;
                }
            }
            if (/^[\!\.\,\s]$/.test(char) && i != n - 1) {
                return false;
            }
        }
        return true;
    }
    
    

Discuss

https://leetcode.com/problems/number-of-valid-words-in-a-sentence/discuss/1537483/C%2B%2B-Straight-Forward

All Problems

All Solutions