🎈 算法并不一定都是很难的题目,也有很多只是一些代码技巧,多进行一些算法题目的练习,可以帮助我们开阔解题思路,提升我们的逻辑思维能力,也可以将一些算法思维结合到业务代码的编写思考中。简而言之,平时进行的算法习题练习带给我们的好处一定是不少的,所以让我们一起来养成算法练习的习惯。今天练习的题目是一道比较简单的题目 ->最大字符串配对数目
问题描述
给你一个下标从 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]
只包含小写英文字母。
思路分析
首先我们应该要先理解一下题目意思,题目会给我们一个数组 words
,数组中包含 互不相同 的字符串。我们需要找出数组中配对的字符串数目,字符串配对规则如下:
- 字符串
words[i]
等于words[j]
的反转字符串。
题目中说到每个字符串最多匹配一次,这个其实是可以忽略的,因为在题目提示中说到words
包含的字符串互不相同,所以一个字符本质上最多也只能找到一个匹配的字符串。
- 判断匹配字符串
如果字符串 words[i]
等于 words[j]
的反转字符串,那么字符串 words[i]
和 words[j]
是可以匹配的一对字符串,我们直接遍历判断两个字符串是否为反转字符串即可。
const checkWord = (word1, word2) => {
if (word1.length !== word2.length) return false;
for (let i = 0; i < word1.length; i++) {
if (word1[i] !== word2[word1.length - 1 - i]) return false;
}
return true;
};
- 遍历字符串数组
words
寻找匹配字符串
数组长度并不长,所以我们可以直接两层遍历直接直接进行匹配判断,因为在题目提示中说到words
包含的字符串互不相同,所以一个字符本质上最多也只能找到一个匹配的字符串,所以在找到匹配的字符串之后可以直接结束当前的循环,继续寻找下一对匹配字符串。
for (let i = 0; i < words.length; i++) {
for (let j = i + 1; j < words.length; j++) {
if (checkWord(words[i], words[j])){
res++;
break;
}
}
}
AC 代码
完整 AC 代码如下:
/**
* @param {string[]} words
* @return {number}
*/
var maximumNumberOfStringPairs = function (words) {
let res = 0;
const checkWord = (word1, word2) => {
if (word1.length !== word2.length) return false;
for (let i = 0; i < word1.length; i++) {
if (word1[i] !== word2[word1.length - 1 - i]) return false;
}
return true;
};
for (let i = 0; i < words.length; i++) {
for (let j = i + 1; j < words.length; j++) {
if (checkWord(words[i], words[j])){
res++;
break;
}
}
}
return res;
};
说在后面
🎉 这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球 🏸 ,平时也喜欢写些东西,既为自己记录 📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解 🙇,写错的地方望指出,定会认真改进 😊,在此谢谢大家的支持,我们下文再见 🙌。