题目描述
句子仅由小写字母(‘a’ 到 ‘z’)、数字(‘0’ 到 ‘9’)、连字符(‘-’)、标点符号(‘!’、‘.’ 和 ‘,’)以及空格(’ ')组成。每个句子可以根据空格分解成 一个或者多个 token ,这些 token 之间由一个或者多个空格 ’ ’ 分隔。
如果一个 token 同时满足下述条件,则认为这个 token 是一个有效单词:
仅由小写字母、连字符和/或标点(不含数字)组成。
至多一个 连字符 ‘-’ 。如果存在,连字符两侧应当都存在小写字母(“a-b” 是一个有效单词,但 “-ab” 和 “ab-” 不是有效单词)。
至多一个 标点符号。如果存在,标点符号应当位于 token 的 末尾 。
这里给出几个有效单词的例子:“a-b.”、“afad”、“ba-c”、“a!” 和 “!” 。
给你一个字符串 sentence ,请你找出并返回 sentence 中 有效单词的数目 。
示例 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" 不是有效单词,因为它含有数字
提示:
1 <= sentence.length <= 1000
sentence 由小写英文字母、数字(0-9)、以及字符(’ ‘、’-‘、’!‘、’.’ 和 ‘,’)组成
句子中至少有 1 个 token
#define pb push_back
class Solution {
public:
vector<string> words;
int countValidWords(string sentence) {
int n = (int)sentence.size();
for(int i = 0; i < n; i ++) {
string s;
int j = i;
while(j < n && sentence[j] != ' ') {
s += sentence[j];
j ++;
}
if(s != "") words.pb(s);
i = j;
}
int ans = 0;
for(auto u : words)
if(check(u)) ans ++;
return ans;
}
bool check(string s) {
int lowernum = 0, lzf = 0, bd = 0;
for(int i = 0; i < s.size(); i ++) {
if(s[i] >= 'a' && s[i] <= 'z') lowernum ++;
else if(s[i] == '-') lzf ++;
else if(s[i] == '.' || s[i] == '!' || s[i] == ',') bd ++;
else return false;
}
int len = (int)s.size();
if(lzf > 1 || bd > 1) return false;
else {
if(bd == 1 && ! judge(s[len - 1])) return false;
else if(lzf == 1) {
int index;
for(int i = 0; i < s.size(); i ++) {
if(s[i] == '-') {
index = i;
break;
}
}
bool flag1 = false, flag2= false;
for(int i = 0; i < index; i ++) {
if(s[i] >= 'a' && s[i] <= 'z') {
flag1 = true;
break;
}
}
for(int i = index + 1; i < s.size(); i ++) {
if(s[i] >= 'a' && s[i] <= 'z') {
flag2 = true;
break;
}
}
if(! flag1 || ! flag2) return false;
else return true;
} else return true;
}
}
bool judge(char ch) {
if(ch == '.' || ch == ',' || ch == '!') return true;
else return false;
}
};
该问题主要涉及字符串处理和正则表达式的应用。给定一个句子,任务是计算其中有效单词的数量。有效单词必须遵循特定规则,如只包含小写字母、连字符和/或标点符号,且限制连字符和标点符号的数量。提供的代码中,定义了一个解决方案,通过遍历句子中的每个token,检查它们是否符合有效单词的条件。最后返回有效单词的总数。
4043

被折叠的 条评论
为什么被折叠?



