809. 情感丰富的文字

简介: 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 。

提示:

  • 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,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球 🏸 ,平时也喜欢写些东西,既为自己记录 📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解 🙇,写错的地方望指出,定会认真改进 😊,偶尔也会在自己的公众号『前端也能这么有趣』发一些比较有趣的文章,有兴趣的也可以关注下。在此谢谢大家的支持,我们下文再见 🙌。

目录
相关文章
|
2月前
|
机器学习/深度学习
给文字动画注入语义灵魂!港科大开源文字跳动技术,每个单词都浪漫
【5月更文挑战第21天】港科大开源动态排版技术(Dynamic Typography),旨在为文字动画赋予语义深度,让每个单词都能生动表达情感。该技术通过字母变形和运动效果,结合神经位移场与端到端优化,生成可读且有表现力的动画。实验显示其优于其他基线方法,但尚无法处理复杂语义和高昂的应用成本。[论文链接](https://arxiv.org/abs/2404.11614)
25 4
|
2月前
|
机器学习/深度学习 自然语言处理 安全
什么是 ChatGPT 生成的文本里所谓的安全词汇
什么是 ChatGPT 生成的文本里所谓的安全词汇
PhotoShop实现文字人物海报效果
PhotoShop实现文字人物海报效果
82 0
PhotoShop实现文字人物海报效果
|
API 语音技术 Python
轻声低语,藏在光芒下的语音转文字模型Whisper
轻声低语,藏在光芒下的语音转文字模型Whisper
1121 0
|
人工智能
StyleGAN 调整面部表情,让虚拟人脸更生动
赋予 AI 人脸表情,让其更生动自然
305 3
StyleGAN 调整面部表情,让虚拟人脸更生动
|
Web App开发 自然语言处理 图形学
自然语言融入NeRF,给点文字就生成3D图的LERF来了
自然语言融入NeRF,给点文字就生成3D图的LERF来了
122 0
|
机器学习/深度学习 自然语言处理 达摩院
长文本口语语义理解技术系列①:段落分割实践
长文本口语语义理解技术系列①:段落分割实践
626 0
|
算法 JavaScript 前端开发
日拱算法:什么是“情感丰富的文字”?
本篇带来算法题:“情感丰富的文字”
|
编解码 前端开发 Windows
[转载]关于字体的一些常识
[转载]关于字体的一些常识
217 0
|
JavaScript 前端开发
文字到底能玩出多少花样(四)实现跃动的文字
文字到底能玩出多少花样(四)实现跃动的文字
129 0
文字到底能玩出多少花样(四)实现跃动的文字

热门文章

最新文章