最大字符串配对数目

简介: 最大字符串配对数目

说在前面

🎈不知道大家对于算法的学习是一个怎样的心态呢?为了面试还是因为兴趣?不管是出于什么原因,算法学习需要持续保持。

题目描述

给你一个下标从 0 开始的数组 words ,数组中包含 互不相同 的字符串。

如果字符串 words[i] 与字符串 words[j] 满足以下条件,我们称它们可以匹配:

字符串 words[i] 等于 words[j] 的反转字符串。

0 <= i < j < words.length

请你返回数组 words 中的 最大 匹配数目。

注意,每个字符串最多匹配一次。

示例 1:

输入:words = ["cd","ac","dc","ca","zz"]
输出:2
解释:在此示例中,我们可以通过以下方式匹配 2 对字符串:
- 我们将第 0 个字符串与第 2 个字符串匹配,因为 word[0] 的反转字符串是 "dc" 并且等于 words[2]。
- 我们将第 1 个字符串与第 3 个字符串匹配,因为 word[1] 的反转字符串是 "ca" 并且等于 words[3]。
可以证明最多匹配数目是 2 。

示例 2:

输入:words = ["ab","ba","cc"]
输出:1
解释:在此示例中,我们可以通过以下方式匹配 1 对字符串:
- 我们将第 0 个字符串与第 1 个字符串匹配,因为 words[1] 的反转字符串 "ab" 与 words[0] 相等。
可以证明最多匹配数目是 1 。

示例 3:

输入:words = ["aa","ab"]
输出:0
解释:这个例子中,无法匹配任何字符串。

提示:

  • 1 <= words.length <= 50
  • words[i].length == 2
  • words 包含的字符串互不相同。
  • words[i] 只包含小写英文字母。

解题思路

题目其实就是要找到数组中的各元素与其他元素的反转字符串相同的个数总和,那么我们首先需要写一个可以反转字符串的方法

反转字符串

最简单的就是从后往前遍历,重新拼接一个字符串返回既可:

const reverse = (word) => {
    let res = '';
    for(let i = word.length - 1; i >= 0; i--) res += word[i];
    return res;
}

还有更简便的方法便是利用数组的reverse方法,可以将数组反转。我们先使用split方法将字符串转为数组,再利用数组的reverse方法将数组反转,最后通过join方法将数组拼接为字符串即可:

const reverse = (word) => {
    return word.split('').reverse().join('');
}

二次遍历计算

我们可以直接进行二次遍历,判断当前元素后面元素的反转字符串与当前元素相等的数量。

/**
 * @param {string[]} words
 * @return {number}
 */
var maximumNumberOfStringPairs = function(words) {
    let cnt = 0;
    for(let i = 0; i < words.length; i++){
        const tmpWord = words[i].split('').reverse().join('');
        for(let j = i + 1; j < words.length; j++){
            if(tmpWord === words[j]) cnt++;
        }
    }
    return cnt;
};

一次遍历计算

当然,我们还有更简便的方法,可以通过一次遍历,使用一个哈希表来保存遍历过的元素的反转字符串,往后遍历的时候判断哈希表中有没有和自己相同的元素即可。

/**
 * @param {string[]} words
 * @return {number}
 */
var maximumNumberOfStringPairs = function(words) {
    let cnt = 0;
    const map = {};
    const reverse = (word) => {
        return word.split('').reverse().join('');
    }
    for(let i = 0; i < words.length; i++){
        if(map[words[i]]) cnt++;
        map[reverse(words[i])] = true;
    }
    return cnt;
};

公众号

关注公众号『前端也能这么有趣』,获取更多有趣内容。

说在后面

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

目录
相关文章
|
安全 Java API
java中HashMap的七种遍历方式
java.util.ConcurrentModificationException , 这种办法是非安全的 , 我们可以使用Iterator.remove() ,或者是Lambda 中的 removeIf() , 或者是Stream 中的 filter() 过滤或者删除相关数据
220 1
|
数据采集 监控 安全
网络爬虫是什么,它有什么作用?
网络爬虫是自动化工具,用于从网站中提取信息,通过追踪超链接和分析网页内容,实现互联网数据的自动搜集与整理。其工作流程包括选择起始URL、下载网页、解析HTML、跟踪链接、提取和存储数据及定期更新。主要用途涵盖数据挖掘、内容聚合、搜索引擎索引、价格比较、网站监控、学术研究及安全合规性等方面。然而,使用时需注意隐私、版权等法律问题。使用动态IP可避免触发网站反爬机制,如选用优质海外代理IP服务提高效率。
|
消息中间件 存储 缓存
消息队列之 MetaQ 和 Kafka 哪个更香!
本篇文章首先介绍了MetaQ消息队列,然后介绍了作者对MetaQ和Kafka这两个消息队列的理解。
|
SQL 关系型数据库 MySQL
sqlite3自动插入创建时间和更新时间
在本文中,作者分享了如何在SQLite3中实现类似MySQL和Postgres的几个基本功能。首先,通过`AUTOINCREMENT`关键字设置了主键ID自增。接着,通过`DEFAULT (DATETIME(&#39;now&#39;, &#39;localtime&#39;))`确保了`created_at`在数据插入时自动获取当前时间。然而,`updated_at`在数据更新时不自动更新,为解决这个问题,作者创建了一个触发器(`trigger_position_info_updated_at`),在更新数据后自动更新`updated_at`字段。
386 0
|
Kubernetes Linux Docker
Kubernetes学习笔记-Part.09 K8s集群构建
Part.01 Kubernets与docker Part.02 Docker版本 Part.03 Kubernetes原理 Part.04 资源规划 Part.05 基础环境准备 Part.06 Docker安装 Part.07 Harbor搭建 Part.08 K8s环境安装 Part.09 K8s集群构建 Part.10 容器回退
1255 2
Kubernetes学习笔记-Part.09 K8s集群构建
【数据结构】堆的建立 (时间复杂度计算-堆排序)---超细致
【数据结构】堆的建立 (时间复杂度计算-堆排序)---超细致
752 0
|
存储 JSON 测试技术
Cypress默认文件结构
Cypress默认文件结构
196 0
|
JavaScript PHP 数据库
layui框架实战案例(18):保存草稿和单选radio复选框checkbox无focus属性快速聚焦跳转的解决方案
layui框架实战案例(18):保存草稿和单选radio复选框checkbox无focus属性快速聚焦跳转的解决方案
423 0
|
Web App开发 Java 测试技术
反了!居然让我教她自动化测试!
一个做测试的居然让我教她怎么做自动化测试,真是反了……行吧,正好懂一些 Selenium,今天就来跟大家一起了解下 Python 如何使用 Selenium 进行自动化测试。
HLS开发学习-14- Vivado HLS 函数层面的优化
HLS开发学习-14- Vivado HLS 函数层面的优化
521 0
HLS开发学习-14- Vivado HLS 函数层面的优化