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

目录
相关文章
|
开发者 物联网 物联网安全
透视盒马:新零售操作系统的秘密
盒马是一个端到端,线上线下一体化的零售业务。在阿里CIO学院攻“疫”技术公益大咖说的第十六场直播中,盒马技术负责人何崚详细介绍了盒马产品技术在构建供给网络、销售网络、物流网络这三个核心命题时遇到的挑战和技术难点。
5204 2
|
4月前
|
SQL 存储 关系型数据库
使用MySQL中的WITH AS子句进行高效数据库查询实践
虑到查询优化,它们是管理复杂SQL语句的有力工具。由于CTE在查询计划中的处理方式可能因MySQL的不同版本而异,建议在特定环境中测试和分析查询性能以确保达到最佳效果。
492 3
|
6月前
|
小程序 视频直播 数据安全/隐私保护
如何在1v1视频直播交友APP中实现防录屏防截屏功能?
婚恋交友市场快速增长,1v1社交应用海外投放增86.49%,中东、东南亚及北美需求旺盛。用户偏好私密高效交流,国内“云相亲”兴起。开发需合规备案、实名认证,并防范诈骗。本文详解原生APP防录屏技术:Android通过MediaProjection检测,iOS监听UIScreen状态,结合动态水印、远程销毁等增强防护,平衡体验与安全。
|
3月前
|
关系型数据库 MySQL 分布式数据库
阿里云数据库上云优选活动参考:RDS年付88元起!RDS/PolarDB+DAS运维服务降低运维门槛
2026年阿里云数据库上云优选活动为用户推出了多款特惠云数据库产品,RDS年付88元起;RDS PostgreSQL 基础系列标准版2核4G(通用型)227.99/1年;数据传输服务 DTS99.00/1月。本文为大家整理了阿里云数据库上云优选活动的具体内容,以供参考。
562 3
|
4月前
|
人工智能 监控 安全
从数据发现到外发管控:安得终端DLP打造闭环数据防泄露方案
安得终端DLP系统构建覆盖数据全生命周期的防泄露体系,融合AI识别、智能分级、全通道管控与实时监控,实现敏感数据发现、保护、审计与响应一体化,助力企业精准防控终端数据泄露风险,保障业务合规与安全高效运转。(238字)
231 0
|
4月前
|
人工智能 JSON 移动开发
AI 试衣服从“娱乐玩具”到真正可商用的能力进化
玩美移动AI Clothes技术专攻商业级虚拟试衣,突破通用大模型局限,实现服装结构精准还原、多体型真实适配、只换衣不换人。支持电商、APP快速集成,推动AI试衣从娱乐走向高转化零售应用。
749 0
|
存储 供应链 安全
区块链技术在选举中的应用:透明与安全的新时代
区块链技术在选举中的应用:透明与安全的新时代
513 16
数据结构学习记录——判断是否为同一颗二叉搜索树(题意理解、求解思路、程序搭建框架、具体函数的实现)
数据结构学习记录——判断是否为同一颗二叉搜索树(题意理解、求解思路、程序搭建框架、具体函数的实现)
313 2
|
监控 安全 网络协议
如何防止内网攻击?
如何防止内网攻击?【10月更文挑战第10天】
497 2
|
SQL 存储 关系型数据库
COALESCE 函数:SQL中的空值处理利器
【8月更文挑战第31天】
8394 0

热门文章

最新文章

下一篇
开通oss服务