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

目录
相关文章
|
Web App开发 XML 人工智能
文本转语音如此简单
这两天在研究文本转音的功能,有时候担心自己的普通话不标准,比方说要录制一个视频,即兴讲可能会卡壳,这个时候我们就可以先准备好文本,然后再利用人工智能来生成音频,下面就分享下我的研究成果吧!
1543 0
|
2月前
|
人工智能
EDTalk:只需上传图片、音频和视频,就能使图片中的人物说话,情感表情与音频情绪高度统一
EDTalk 是上海交通大学与网易联合研发的高效解耦情感说话头像合成模型,能够独立控制嘴型、头部姿态和情感表情,适用于多种应用场景。
145 26
EDTalk:只需上传图片、音频和视频,就能使图片中的人物说话,情感表情与音频情绪高度统一
|
5月前
|
API Docker 容器
SenseVoice实现语音转文字
这篇文章介绍了如何使用SenseVoice实现语音转文字的功能,包括通过Docker部署服务、使用网页界面或API进行语音文件的转换,并提供了详细的部署与使用步骤。
752 1
SenseVoice实现语音转文字
|
7月前
|
网络安全 语音技术
语音情感基座模型emotion5vec 问题之什么是歌曲情感识别,在歌曲情感识别任务中,emotion2vec的如何表现
语音情感基座模型emotion5vec 问题之什么是歌曲情感识别?在歌曲情感识别任务中,emotion2vec的如何表现
|
7月前
|
机器学习/深度学习 人工智能 语音技术
情感识别与表达:FunAudioLLM的情感智能技术
【8月更文第28天】随着人工智能的发展,语音交互系统越来越普遍。其中,情感智能技术成为提高用户体验的关键因素之一。本文将探讨 FunAudioLLM 如何利用情感识别和表达技术来增强语音交互的真实感,并提供具体的代码示例。
515 0
|
8月前
|
文字识别
【提取翻译竖排文字日文图片的软件】竖排的日语图片文字识别翻译,竖排的日语图片文字如何识别,竖排日语图片识别后转横排,竖排的日语识别比较友好的方法
这款软件专攻竖排日语图片文字识别,支持自动横排转换,能准确提取左右排版文字,并翻译成中文。用户可从百度网盘或腾讯云盘下载。功能包括图片打开、拖拽识别、截屏拾取、顺序识别、文字导出、快捷搜索及窗体操作。识别时注意保持文字等高以减少误差。附带视频教程(BV1vW4y1p7st)帮助快速上手。
895 0
|
人工智能 自然语言处理
|
API 语音技术 Python
轻声低语,藏在光芒下的语音转文字模型Whisper
轻声低语,藏在光芒下的语音转文字模型Whisper
1389 0
|
自然语言处理 达摩院 算法
长文本口语语义理解技术系列②:关键词抽取实践
长文本口语语义理解技术系列②:关键词抽取实践
262 0
长文本口语语义理解技术系列②:关键词抽取实践
|
机器学习/深度学习 自然语言处理 达摩院
长文本口语语义理解技术系列③:待办抽取实践
长文本口语语义理解技术系列③:待办抽取实践
361 0