说在前面
🎈不知道大家对于算法的学习是一个怎样的心态呢?为了面试还是因为兴趣?不管是出于什么原因,算法学习需要持续保持。
题目描述
有时候人们会用重复写一些字母来表示额外的感受,比如 "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 。
提示:
1 <= s.length, words.length <= 100
1 <= words[i].length <= 100
- s 和所有在
words
中的单词都只由小写字母组成。
解题思路
该函数的目标是判断 words 数组中的单词是否符合特定的表达式规则。具体来说,对于字符串 s 中的每个字符,如果存在连续的相同字符且出现次数满足以下条件之一:
如果字符连续出现次数小于 3,则 words 中的单词必须也是连续重复字符且出现次数相同。
如果字符连续出现次数大于等于 3,则 words 中的单词可以是任意长度的连续重复字符。
如果 words 数组中的所有单词都符合上述规则,那么函数将返回 words 数组的长度,表示满足条件的单词数量;否则,返回 0。
具体实现方面,函数内部定义了一个辅助函数 check,用于检查单个单词是否满足规则。在 check 函数中,通过两个指针 index 和 i 分别追踪字符串 s 和 words 的位置。通过循环遍历 words 数组中的单词,同时使用两个计数器 cnt1 和 cnt2 来统计字符出现次数。
当遇到连续相同字符结束时,check 函数会进行条件判断。如果不满足规则,则直接返回 0,表示该单词不符合要求。否则,继续遍历下一个单词。
最后,函数使用 reduce 方法对 words 数组进行遍历,并通过调用 check 函数来判断每个单词是否符合规则。累加符合规则的单词数量,并将最终结果返回。
AC代码
/** * @param {string} s * @param {string[]} words * @return {number} */ var expressiveWords = function(s, words) { const check = (s,words) =>{ let index = 0,cnt1 = 0,cnt2 = 0; for(let i = 0; i < words.length; i++){ cnt1++; if(words[i] !== words[i + 1]){ while(s[index] === words[i]){ cnt2++; index++; } if((cnt1 === 0 || cnt2 < 3 || cnt1 > cnt2) && cnt1 !== cnt2) return 0; cnt1 = 0; cnt2 = 0; } } return index >= s.length ? 1 : 0; } return words.reduce((a,b) =>{ return a + check(s,b); },0); }; // let s = "heeellooo",words = ["hello", "hi", "helo"]; // s = "tttttllll",words = ["tl","tll","ttll","ttl"]; // s = "abcd",words = ["abc"]; // s = "dddiiiinnssssssoooo",words = ["dinnssoo","ddinso","ddiinnso","ddiinnssoo","ddiinso","dinsoo","ddiinsso","dinssoo","dinso"]; // console.log(expressiveWords(s,words));
公众号
关注公众号『前端也能这么有趣
』,获取更多有趣内容。
说在后面
🎉 这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球 🏸 ,平时也喜欢写些东西,既为自己记录 📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解 🙇,写错的地方望指出,定会认真改进 😊,偶尔也会在自己的公众号『
前端也能这么有趣
』发一些比较有趣的文章,有兴趣的也可以关注下。在此谢谢大家的支持,我们下文再见 🙌。