持续创作,加速成长!这是我参与「掘金日新计划 · 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;
}
}