首页 > 编程语言 >算法题之宝石与石头

算法题之宝石与石头

时间:2024-09-23 14:20:35浏览次数:9  
标签:stones 宝石 int 复杂度 jewels 石头 ++ 算法 jewelsCount

宝石与石头

给你一个字符串 jewels 代表石头中宝石的类型,另有一个字符串 stones 代表你拥有的石头。 stones 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。

字母区分大小写,因此 "a" 和 "A" 是不同类型的石头。

示例 1:

输入:jewels = "aA", stones = "aAAbbbb"
输出:3

示例 2:

输入:jewels = "z", stones = "ZZ"
输出:0

提示:

  • 1 <= jewels.length, stones.length <= 50
  • jewels 和 stones 仅由英文字母组成
  • jewels 中的所有字符都是 唯一的

解题思路一:暴力

首先我们定义一个变量jewelCount,用来返回找到的宝石数量。

int jewelsCount = 0;

我们分别遍历字符串jewels和stones,然后逐一比较两个字符串中的字符串

int jewelsLength = jewels.length(), stonesLength = stones.length();
for (int i = 0; i < stonesLength; i++) { // 遍历stones
    char stone = stones.charAt(i);
    for (int j = 0; j < jewelsLength; j++) { // 遍历jewels
        char jewel = jewels.charAt(j);
        if (stone == jewel) {
            // doSomething
        }
    }
}

相同则说明是宝石,所以变量jewelCount加一。

if (stone == jewel) {
    jewelsCount++;
    break;
}

遍历完以后,我们返回结果,具体代码如下所示:

class Solution {
    public int numJewelsInStones(String jewels, String stones) {
        int jewelsCount = 0;
        int jewelsLength = jewels.length(), stonesLength = stones.length();
        for (int i = 0; i < stonesLength; i++) {
            char stone = stones.charAt(i);
            for (int j = 0; j < jewelsLength; j++) {
                char jewel = jewels.charAt(j);
                if (stone == jewel) {
                    jewelsCount++;
                    break;
                }
            }
        }
        return jewelsCount;
    }
}

复杂度分析

  • 时间复杂度:O(mn),遍历jewels和stones的时间复杂度分别为O(m)O(n),所以总的时间复杂度为O(mn)
  • 空间复杂度:O(1),我们只使用了额外常量的空间。

解题思路二:哈希集合

我们可以用一个哈希集合,来存储jewels里的字符,然后遍历stones的字符,判断是否存在宝石。通过哈希集合的结构,可以降低时间复杂度。

具体代码如下:

class Solution {
    public int numJewelsInStones(String jewels, String stones) {
        int jewelsCount = 0;
        Set<Character> jewelsSet = new HashSet<Character>();
        int jewelsLength = jewels.length(), stonesLength = stones.length();
        for (int i = 0; i < jewelsLength; i++) {
            char jewel = jewels.charAt(i);
            jewelsSet.add(jewel);
        }
        for (int i = 0; i < stonesLength; i++) {
            char stone = stones.charAt(i);
            if (jewelsSet.contains(stone)) {
                jewelsCount++;
            }
        }
        return jewelsCount;
    }
}

复杂度分析

  • 时间复杂度:O(m+n),遍历jewels和stones的时间复杂度分别为O(m)O(n),每次遍历stones,判断哈希集合里是否存在宝石的时间复杂度为O(1)所以总的时间复杂度为O(m+n)
  • 空间复杂度:O(m),我们使用了哈希数组存储jewels的全部字符

标签:stones,宝石,int,复杂度,jewels,石头,++,算法,jewelsCount
From: https://blog.csdn.net/qq_34149443/article/details/142457408

相关文章

  • Python中Sha加密算法
    '''DES:Python3.x中的加密在python3的标准库中,已经移除了md5,而关于hash加密算法都放在hashlib这个标准库中,hashlib模块就包括了SHA1、SHA224、SHA256、SHA384、SHA512和MD5算法等。通常我们的加密,都是对二进制编码的格式进行加密的;而在Python中,使用的是Bytes......
  • MATLAB代码生成工具箱:从算法到部署的全面指南
    在现代工程实践中,将MATLAB算法高效地转换为C/C++代码对于嵌入式系统开发至关重要。MATLAB代码生成工具箱(MATLABCoder)提供了一套强大的工具,使得这一过程变得简单而直接。本文将详细介绍如何使用MATLAB代码生成工具箱,从准备MATLAB代码到生成C/C++代码,再到代码的测试与部署。......
  • 2024金三银四苦刷算法28天!成功收获字节Offer
    **毕竟现在大厂里用的都是算法,所以这块内容不吃透肯定是不行的。**目录如下:图文并茂,附有刷题答案源码。第一份:LeetCode算法收割机=================由于篇幅原因,为了避免影响到大家的阅读体验,在此只以截图展示部分内容,详细完整版的看文末有免费的获取方式!部分目录展示:......
  • BCH算法设计
    ``moduleBCH_CHIEN#(parameterBCH_T=2,parameterBCH_GF_M=8,parameterBCH_GF_ELM=255,parameterBCH_CHIEN_WIDTH=16,//numberofrootstocheckforeachcycleparameterBCH_CHIEN_DEPTH=16//numberofpiplinedep......
  • OpenCV(Canny 边缘检测算法)
    目录1.高斯滤波(GaussianBlur)2.计算梯度强度和方向(GradientCalculation)3.非极大值抑制(Non-MaximumSuppression)3.1示例1.梯度强度矩阵(7x7)2.每个像素的梯度方向(7x7)3.非极大值抑制过程4.非极大值抑制后的矩阵(7x7)4.双阈值处理(DoubleThresholding)5.边缘连接(EdgeTracking......
  • 时间序列无监督异常点检测算法_孤立森林,局部离群因子检测和自编码器
    数据入口:压气机异常检测一维时间序列-Heywhale.com该数据为采样自工业压气机的一维时间序列数据。本文将通过无监督时间序列算法进行时间序列异常检测。针对时间序列数据,常用的无监督异常检测算法包括:孤立森林(IsolationForest)、基于密度的局部离群因子检测(LOF)、自编码器(Au......
  • 25石头科技机械结构工程师机械面试问题攻略
    25石头科技机械结构工程师面试心得石头科技面试题目+答案免费资源:【免费】25石头科技机械结构工程师机械面试心得资源-CSDN文库https://download.csdn.net/download/m0_72216164/89768935?spm=1001.2014.3001.5503下面分享石头科技机械结构工程师面试全过程。①一面(40min)......
  • 【面试经验】大疆2024届秋招控制算法岗笔试
    建议之后想进大疆控制方向的学弟学妹们,准备好以下几点,笔试挂掉的血泪教训:1、经典控制理论和现代控制理论经典控制里面的拉式变换、传递函数建立、稳定性裕量、稳定性判据、系统校正和零极点配置,要熟练掌握;现代控制理论里面根据动态系统列状态空间方程,观测器估计器收敛性分......
  • DFP算法-MATLAB
    背景DFP算法是在20世纪60年代初期由Davidon、Fletcher和Powell共同开发的,是拟牛顿法(Quasi-NewtonMethods)的一种重要实现。拟牛顿法的基本思想是利用目标函数在当前点附近的二次近似来构造搜索方向,并通过迭代更新这一近似来逼近真实的解。DFP算法通过不断更新Hessian矩阵的逆......
  • DeepCross模型实现推荐算法
    1.项目简介A032-DeepCross项目是一个基于深度学习的推荐算法实现,旨在解决个性化推荐问题。随着互联网平台上信息和内容的爆炸式增长,用户面临着信息过载的困境,如何为用户提供高效、精准的推荐成为了关键。该项目背景基于现代推荐系统的发展,利用用户行为数据和内容特征,来生......