C C++算法题解LeetCode1408数组中的字符串匹配

C C++算法题解LeetCode1408数组中的字符串匹配

问题描述

给定字符串数组 words,在其中找到两个不同的单词,使得它们的长度之和最长。可以假设 words 中至少存在两个单词。

返回两个单词长度之和的最大值。

解题思路

方法一:暴力枚举

我们可以将字符串数组中的字符串两两组合,计算它们的长度之和并更新最大值,最后返回最大值即可。

时间复杂度:$O(n^2k)$,其中 $n$ 是字符串数组中字符串的个数,$k$ 是字符串的平均长度。

class Solution {
public:
    int maxProduct(vector<string>& words) {
        int n = words.size(), ans = 0;
        for (int i = 0; i < n; i++) {
            for (int j = i + 1; j < n; j++) {
                if (check(words[i], words[j])) {
                    ans = max(ans, int(words[i].size() * words[j].size()));
                }
            }
        }
        return ans;
    }

    bool check(string s1, string s2) {
        vector<int> cnt(26);
        for (char c : s1) cnt[c - 'a']++;
        for (char c : s2) {
            if (cnt[c - 'a']) return false;
        }
        return true;
    }
};

方法二:位运算

观察题目给出的数据范围,发现单词的小写字母只有 $26$ 种,可以使用一个 $32$ 位的整数来记录一个单词中出现的字母。

我们可以先将字符串数组中的单词转换为对应的整数,然后再将整数两两做与运算,结果为 $0$ 的两个整数所对应的单词就是符合条件的两个单词。

时间复杂度:$O(n^2+\frac{n^2k⋅k}{32})$,其中 $n$ 是字符串数组中字符串的个数,$k$ 是字符串的平均长度。

class Solution {
public:
    int maxProduct(vector<string>& words) {
        int n = words.size(), ans = 0;
        vector<int> nums(n);
        for (int i = 0; i < n; i++) {
            for (char c : words[i]) {
                nums[i] |= 1 << (c - 'a');
            }
            for (int j = 0; j < i; j++) {
                if ((nums[i] & nums[j]) == 0) {
                    ans = max(ans, int(words[i].size() * words[j].size()));
                }
            }
        }
        return ans;
    }
};

示例说明

示例一

输入:

["a","ab","abc","d","cd","bcd","abcd"]

输出:

4

解释:

其中一组最长的不同单词为 "ab" 和 "cd",其长度之和为 4。

示例二

输入:

["a","aa","aaa","aaaa"]

输出:

0

解释:

无法找到两个不同的单词,因此输出 0。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C C++算法题解LeetCode1408数组中的字符串匹配 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • GO语言中常见的排序算法使用示例

    首先感谢你对“GO语言中常见的排序算法使用示例”的关注,下面是一个完整的攻略: GO语言中常见的排序算法 在GO语言中,常见的排序算法包括:冒泡排序、插入排序、选择排序、希尔排序、归并排序、快速排序、堆排序等。这些排序算法的具体实现方式有所不同,但都可以在GO语言的标准库中找到相应的方法。 冒泡排序 冒泡排序的基本思路是比较相邻的两个元素,如果它们的顺序错误…

    算法与数据结构 2023年5月19日
    00
  • 全排列算法的非递归实现与递归实现的方法(C++)

    全排列算法是计算机科学领域中的一个经典问题,其功能是对给定的一组数进行全排列。在本文中,我们将对该算法的非递归实现和递归实现方法进行详细讲解。本文的代码示例基于C++语言。 非递归实现方法 算法思路 假设我们想对n个数进行全排列,那么我们可以首先将这n个数按照升序排列,然后使用以下步骤: 把这n个数的全排列问题转化为n-1个数的全排列问题; 依次取出每一个数…

    算法与数据结构 2023年5月19日
    00
  • C#七大经典排序算法系列(下)

    《C#七大经典排序算法系列(下)》是一篇文章,通过介绍七种经典的排序算法,帮助读者更好地理解排序算法的原理和操作,并且让读者掌握这些算法的基本实现方法。本文将会细致地讲解每种算法的思路、时间复杂度以及使用场景,希望读者能在阅读后掌握七种排序算法的差异和选用方法。 文章包含七种排序算法,分别为:冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序和希尔排序…

    算法与数据结构 2023年5月19日
    00
  • 图解Java排序算法之快速排序的三数取中法

    图解Java排序算法之快速排序的三数取中法 什么是快速排序 快速排序是一种常见的排序方法,它的特点是在待排序的记录序列中,通过一趟排序将待排序的记录分割成独立的两部分,其中一部分的记录关键字均比另一部分的关键字小。 快速排序的基本流程 快速排序的基本流程如下: 从数列中挑出一个元素,称为“基准”(pivot)。 对数列重新排序,将比基准值小的元素放在基准前面…

    算法与数据结构 2023年5月19日
    00
  • C#实现快速排序算法

    下面是C#实现快速排序算法的完整攻略: 快速排序算法简介 快速排序算法是一种高效的排序算法,它的时间复杂度为O(nlogn)。快速排序算法的基本思想是,通过一趟排序将待排序列分隔成独立的两部分,其中一部分的所有数据都比另外一部分小,然后再对这两部分继续进行排序,以达到整个序列有序的目的。 快速排序算法实现步骤 快速排序算法的实现步骤如下: 选择一个中间值,将…

    算法与数据结构 2023年5月19日
    00
  • C++实现冒泡排序(BubbleSort)

    C++实现冒泡排序(BubbleSort)攻略 冒泡排序是一种简单的排序算法,它会重复地比较相邻的两个元素,如果顺序错误就交换它们的位置,直到排序完成。下面是C++实现冒泡排序的步骤。 1. 理解冒泡排序的基本原理 冒泡排序的基本思路是将待排序的数组分为已排序的部分和未排序的部分,先从未排序的部分开始,进行比较相邻元素的大小,并交换位置,直到本轮最大的元素被…

    算法与数据结构 2023年5月19日
    00
  • C语言排序算法之冒泡排序实现方法【改进版】

    C语言排序算法之冒泡排序实现方法【改进版】可以采用双层循环的方式实现。接下来,我将为您详细介绍该排序算法的实现方法。 冒泡排序的基本思路 冒泡排序的基本思路是:通过比较相邻的元素,将小的元素交换到前面,大的元素交换到后面。在第一轮排序时,第一个元素与第二个元素进行比较,若第一个元素比第二个元素大,则将两个元素交换位置。接下来,第二个元素与第三个元素进行比较,…

    算法与数据结构 2023年5月19日
    00
  • PHP数组递归排序实现方法示例

    当我们需要对 PHP 数组进行排序时,通常会使用 sort() 或者 usort() 函数,但这些函数只能对一维数组进行排序。当数组是多维结构时,我们需要使用递归的方式进行实现。 以下是一个 PHP 数组递归排序的示例实现: 定义待排序的数组 $student_scores = [ "class 1" => [ "Pete…

    算法与数据结构 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部