809 情感丰富的文字
作者:互联网
题目描述:
有时候人们会用重复写一些字母来表示额外的感受,比如 “hello” -> “heeellooo”, “hi” -> “hiii”。我们将相邻字母都相同的一串字符定义为相同字母组,例如:“h”, “eee”, “ll”, “ooo”。
对于一个给定的字符串 S ,如果另一个单词能够通过将一些字母组扩张从而使其和 S 相同,我们将这个单词定义为可扩张的(stretchy)。扩张操作定义如下:选择一个字母组(包含字母 c ),然后往其中添加相同的字母 c 使其长度达到 3 或以上。
例如,以 “hello” 为例,我们可以对字母组 “o” 扩张得到 “hellooo”,但是无法以同样的方法得到 “helloo” 因为字母组 “oo” 长度小于 3。此外,我们可以进行另一种扩张 “ll” -> “lllll” 以获得 “helllllooo”。如果 S = “helllllooo”,那么查询词 “hello” 是可扩张的,因为可以对它执行这两种扩张操作使得 query = “hello” -> “hellooo” -> “helllllooo” = S。
输入一组查询单词,输出其中可扩张的单词数量。
示例:
输入:
S = “heeellooo”
words = [“hello”, “hi”, “helo”]
输出:1
解释:
我们能通过扩张 “hello” 的 “e” 和 “o” 来得到 “heeellooo”。
我们不能通过扩张 “helo” 来得到 “heeellooo” 因为 “ll” 的长度小于 3 。
说明:
0 <= len(S) <= 100。
0 <= len(words) <= 100。
0 <= len(words[i]) <= 100。
S 和所有在 words 中的单词都只由小写字母组成。
方法1:
主要思路:解题链接汇总
(1)先对给定的字符串S进行分解,获得各个字母组的分布;
(2)对给定的各个单词进行判断,能否扩张为给定的字符串;
(3)首先对应的字符相同;
(4)其次原字符串的对应的字母组长度小于3时,则当前字符串的字母组的长度应与之相同;
(5)若大于等于3时,则当前字符串的字母组的长度应小于该长度;
(6)整体分布的字母组数量应该一致;
class Solution {
public:
int expressiveWords(string S, vector<string>& words) {
vector<pair<char,int>> mp;
for(int i=0;i<S.size();){//对原字符串进行分割统计,获得各个字母组的分布
char cur_char=S[i];
int cur_len=0;
while(i<S.size()&&S[i]==cur_char){
++i;
++cur_len;
}
mp.push_back({cur_char,cur_len});
}
int res=0;//统计数量
for(string& word:words){//判读各个单词能否扩展
int index=0;//原字符串中各个字母组的索引
bool is_valid=true;//是否能够扩展
for(int i=0;i<word.size();){//当前单词
if(index==mp.size()||mp[index].first!=word[i]){//当前字母组是否字符相同
is_valid=false;
break;
}
//当前字母组的长度
char cur_char=word[i];
int cur_len=0;
while(i<word.size()&&word[i]==cur_char){
++i;
++cur_len;
}
//长度是否符合要求
if((mp[index].second<3&&mp[index].second!=cur_len)||(cur_len>mp[index].second)){
is_valid=false;
break;
}
//判断下一个字母组
++index;
}
if(is_valid&&index==mp.size()){//有效
++res;
}
}
return res;
}
};
标签:文字,index,cur,int,字母,情感,单词,++,809 来源: https://blog.csdn.net/weixin_44171872/article/details/113575756