「这是我参与2022首次更文挑战的第9天,活动详情查看:2022首次更文挑战」。
题目描述
句子仅由小写字母('a' 到 'z')、数字('0' 到 '9')、连字符('-')、标点符号('!'、'.' 和 ',')以及空格(' ')组成。每个句子可以根据空格分解成 一个或者多个 token ,这些 token 之间由一个或者多个空格 ' ' 分隔。
如果一个 token 同时满足下述条件,则认为这个 token 是一个有效单词:
仅由小写字母、连字符和/或标点(不含数字)。 至多一个 连字符 '-' 。如果存在,连字符两侧应当都存在小写字母("a-b" 是一个有效单词,但 "-ab" 和 "ab-" 不是有效单词)。 至多一个 标点符号。如果存在,标点符号应当位于 token 的 末尾 。 这里给出几个有效单词的例子:"a-b."、"afad"、"ba-c"、"a!" 和 "!" 。
给你一个字符串 sentence ,请你找出并返回 sentence 中 有效单词的数目 。
思路分析
首先使用空格将元素分割,然后逐个判断是否是有效单词。
对于每一个单词,判断是否是空(两个空格连在一起可能造成的问题)
对于每个单词,如果标点符号不再末尾,无效,如果标点符号超过一个,无效。
如果连字符在末尾或者开头,无效,如果超过一个,无效。
具体实现
class Solution {
public:
int countValidWords(string sentence) {
vector<string> arr;
SplitString(sentence, arr, " ");
int manlen = 0, henglen = 0;
int ret = 0;
bool flag = true;
for(auto t: arr){
//对于每个字符串
// cout << t << endl;
if(t.size() == 0){
continue;
}
for(int i = 0; i < t.size(); i++){
if(t[i] == '-'){
if (i == 0 || i == t.size() - 1){
flag = false;
break;
}
if (!(isZiMu(t[i - 1]) && isZiMu(t[i+1]))){
flag = false;
break;
}
henglen ++;
if (henglen == 2){
flag = false;
break;
}
}else if (t[i] == '!' || t[i] == '.' || t[i] == ','){
if(i != t.size() - 1){
flag = false;break;
}
manlen++;
if (manlen == 2){
flag = false;
break;
}
// }else if (!((t[i] >= 'a'&& t[i] <= 'z') || (t[i] >= '0' && t[i] <= '9'))){
}else if (!((t[i] >= 'a'&& t[i] <= 'z') )){
flag = false;
break;
}
}
henglen = 0, manlen = 0;
if(flag)ret++;
flag = true;
}
return ret;
}
bool isZiMu(char c){
if (c >= 'a' && c <= 'z')return true;
return false;
}
void SplitString(const std::string& s, std::vector<std::string>& v, const std::string& c)
};
总结
splitstring是在网上找的实现,这里就不贴了