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日

相关文章

  • JavaScript中三种常见的排序方法

    请听我详细讲解JavaScript中三种常见的排序方法。 什么是排序算法 排序算法是一种基本的算法,用于将一组数据按照某种规则进行排序。在实际开发中,排序算法被广泛应用于数据的处理和管理中。 JavaScript中三种常见的排序方法 在JavaScript中,常见的排序算法有以下三种: 冒泡排序 冒泡排序(Bubble Sort)是一种基本的排序算法,通常通…

    算法与数据结构 2023年5月19日
    00
  • 合并排序(C语言实现)

    合并排序(C语言实现) 合并排序是一种将待排序序列分成多个子序列,分别进行排序,然后再将排序后的子序列合并成整体有序序列的排序算法。使用递归实现时,该算法的时间复杂度为O(nlogn),因此被广泛应用。 实现步骤 合并排序可以用以下步骤来实现: 分治:将待排序序列从中间分成两部分,递归地对左右两部分进行排序。 合并:将两个有序子序列合并成一个有序序列。 在实…

    算法与数据结构 2023年5月19日
    00
  • C++ sort排序之降序、升序使用总结

    C++ sort排序之降序、升序使用总结 介绍 sort函数是C++ STL库提供的一种排序函数,可以快速方便地对数组或容器进行排序。本文将详细介绍sort函数的用法,包括排序方式、自定义比较函数和对容器的排序等内容。 基本用法 sort函数的声明如下: template <class RandomAccessIterator> void sor…

    算法与数据结构 2023年5月19日
    00
  • 数据排序谁最快(javascript中的Array.prototype.sort PK 快速排序)

    首先,我们需要明确两个概念:Array.prototype.sort 和 快速排序算法。 Array.prototype.sort() 是 JavaScript 数组原生的排序方法,可以用于将数组中的元素按照某种规则进行排序。而快速排序算法则是一种高效的排序算法,其核心思想是通过递归将数组拆分成多个小数组,然后依次对这些小数组进行排序。 Array.prot…

    算法与数据结构 2023年5月19日
    00
  • C语言深入探究直接插入排序与希尔排序使用案例讲解

    C语言深入探究直接插入排序与希尔排序使用案例讲解 直接插入排序 算法描述 直接插入排序的基本思想是将一个记录插入到已经排序好的有序表中,从而得到一个新的、记录数增加1的有序表。具体算法流程如下: 从第一个元素开始,该元素可以认为已经被排序 取出下一个元素,在已经排序的元素序列中从后向前扫描 如果该元素大于新元素,将该元素移到下一位置 重复步骤3,直到找到已排…

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

    C++实现双向冒泡排序算法 算法介绍 双向冒泡排序,也称为鸡尾酒排序或定向冒泡排序,是冒泡排序的改进版本。其基本思路与冒泡排序相同,不同之处在于每次排序时同时从数组两侧开始,分别向中间移动。这种方法能够更快地将大数和小数分别冒泡到数组的两端,从而减少了排序次数,提高了排序效率。 下面是双向冒泡排序的具体步骤:1. 从左往右进行一轮冒泡排序,将最小的数排到数组…

    算法与数据结构 2023年5月19日
    00
  • 如何利用Python动态展示排序算法

    首先,我们需要了解一下Python中常用的用于动态展示的库——matplotlib和pygame。 matplotlib是一个数据可视化库,它可以让我们轻松地创建各种静态和动态的图形,包括折线图、柱形图等等,而pygame则是一个开源的游戏开发库,它专用于创建游戏和动态图形。 接下来,我们就可以使用这两个库来展示排序算法了。 下面是一个示例,展示了如何使用m…

    算法与数据结构 2023年5月19日
    00
  • 快速排序算法在Swift编程中的几种代码实现示例

    让我为您详细讲解“快速排序算法在Swift编程中的几种代码实现示例”的完整攻略。 快速排序算法简介 快速排序是一种常用的排序算法,其基本思想是通过一个枢轴(pivot)将待排序数组分成两个部分,一部分小于枢轴,一部分大于枢轴,然后对这两个部分进行递归排序,最终得到一个有序的数组。 快速排序算法实现 下面是三种在Swift编程中实现快速排序算法的代码示例。 代…

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