最大字符串配对数目

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

说在前面

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

题目描述

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

目录
相关文章
|
3月前
输入3个数a,b,c,按大小顺序输出
输入3个数a,b,c,按大小顺序输出。
103 9
|
8月前
对任意给定的两个正整数,100<n<m<1000,计算这两个数之间所有素数和,包含m,n自身
对任意给定的两个正整数,100<n<m<1000,计算这两个数之间所有素数和,包含m,n自身
56 0
对任意给定的两个正整数,100<n<m<1000,计算这两个数之间所有素数和,包含m,n自身
|
8月前
|
算法 测试技术 C#
【状态机dp 状态压缩 分组】1994. 好子集的数目
【状态机dp 状态压缩 分组】1994. 好子集的数目
|
8月前
|
存储
leetcode2744. 最大字符串配对数目
leetcode2744. 最大字符串配对数目
39 0
|
算法 测试技术 C#
C++算法:拼接最大数
C++算法:拼接最大数
|
算法
算法练习——(1)找数组中唯一成对的那个数(异或)
——如何找数组中唯一成对的那个数(数组特殊) 1-1000这一千个数放在含有1001个元素的数组中,只有唯一的一个元素值重复,其他均只出现一次。 每个数组元素只能访问一次,设计一个算法,将他找出来;不用辅助储存空间,设计一个算法实现.
121 0
编写输出1~100之间的素数,要求每行显示5个数
编写输出1~100之间的素数,要求每行显示5个数
给定一个字符串,能否最多删除一段连续的一段使得剩下的为“2020”
给定一个字符串,能否最多删除一段连续的一段使得剩下的为“2020”
87 0
|
C语言
符号配对 (20 分)
符号配对 (20 分)
214 0
字符串个数匹配问题
# 7-2 子字符串个数匹配 分别输入两个字符串A和B,A由多个小字符串组成(中间由非字母隔开),B是由字母组成的字符串。求出A中包含B的小字符串的个数(详细看样例),并且输出它。(不区分大小写) ### 输入格式: 先输入字符串A,由回车结束。然后输入字符串B。 ### 输出格式: 输出A中包含B字符串的个数、 ### 输入样例: 在这里给出一组输入。例如: ```in aaBbc4./ewfeAbc wefW%!%&aAbc++0 4Abccabc aBc ``` ### 输出样例: 在这里给出相应的输出。例如: ```out 3 ``` 解释: A可以看成:a
537 0