Problem
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 all three of the following are true:
It only contains lowercase letters, hyphens, and/or punctuation (no digits).
There is at most one hyphen
'-'. If present, it must 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 must be at the end of the token (
"ab,","cd!", and"."are valid, but"a!b"and"c.,"are not valid).
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.
Constraints:
1 <= sentence.length <= 1000sentenceonly contains lowercase English letters, digits,' ','-','!','.', and','.There will be at least
1token.
Solution (Java)
class Solution {
public int countValidWords(String sentence) {
String[] tokens = sentence.split("\\s+");
int count = 0;
for (String token : tokens) {
int hyphenCount = 0;
int punctuationMarkCount = 0;
boolean valid = true;
if (token.isEmpty() || token.equals("")) {
continue;
}
for (int i = 0; i < token.length(); i++) {
if (token.charAt(i) == '-') {
hyphenCount++;
if (hyphenCount > 1
|| i == 0
|| i == token.length() - 1
|| !Character.isAlphabetic(token.charAt(i - 1))
|| !Character.isAlphabetic(token.charAt(i + 1))) {
valid = false;
break;
}
} else if (token.charAt(i) == '!'
|| token.charAt(i) == '.'
|| token.charAt(i) == ',') {
punctuationMarkCount++;
if (punctuationMarkCount > 1 || i != token.length() - 1) {
valid = false;
break;
}
} else if (Character.isDigit(token.charAt(i))) {
valid = false;
break;
}
}
if (valid) {
count++;
}
}
return count;
}
}
Explain:
nope.
Complexity:
- Time complexity : O(n).
- Space complexity : O(n).