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