Leetcode1071. 字符串的最大公因子(三种方法,带详细解析)

2023-10-05 00:36

本文主要是介绍Leetcode1071. 字符串的最大公因子(三种方法,带详细解析),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Leetcode1071. 字符串的最大公因子

对于字符串 s 和 t,只有在 s = t + … + t(t 自身连接 1 次或多次)时,我们才认定 “t 能除尽 s”。

给定两个字符串 str1 和 str2 。返回 最长字符串 x,要求满足 x 能除尽 str1 且 x 能除尽 str2 。


示例 1:

输入:str1 = “ABCABC”, str2 = “ABC”
输出:“ABC”


示例 2:

输入:str1 = “ABABAB”, str2 = “ABAB”
输出:“AB”

示例 3:


输入:str1 = “LEET”, str2 = “CODE”
输出:“”


提示:

1 <= str1.length, str2.length <= 1000
str1 和 str2 由大写英文字母组成

方法一:最大公因子法

分析:

  1. 如果两个字符串有最大公因子那么str1+str2和str2+str1一定是一样的
    比如例一:str1 = “ABCABC”, str2 = “ABC” str1+str2 和 str2+str1 都是"ABCABCABC"
    如果两个字符串没有最大公因子那么str1+str2和str2+str1一定不一样
  2. 如果两个字符串有最大公因子那么str1,str2他们的长度一定符合辗转相除法,我们可以通过两个字符串的长度,计算出他们最大公因子的长度
    比如例一中str1的长度为6,str2的长度为3,6和3的最大公因数是3,输出的结果长度恰好是3
  3. 然后通过计算出来的长度使用substring()截取出来即可
	var gcdOfStrings = function (str1, str2) {if (str1 + str2 !== str2 + str1) return '' // 如果不满足最大公因子的条件直接返回空字符串const gcd = (a, b) => (a % b == 0 ? b : gcd(b, a % b))//辗转相除法return str1.substring(0, gcd(str1.length, str2.length))};

运行结果

在这里插入图片描述

方法二:暴力

这个效率比较慢,主要是针对不满足条件的情况会比较浪费时间,当然可以在前面加一个不满足条件的直接返回空来解决这个效率慢的问题

源码版

var gcdOfStrings = function (str1, str2) {let factor = str1.length > str2.length ? str2 : str1;while (factor.length) {if (str1.split(factor).every(e => e === '') &&str2.split(factor).every(e => e === '')) {return factor;}factor = factor.slice(0, -1);}return ''
};

解析版

  var gcdOfStrings = function (str1, str2) {let factor = str1.length > str2.length ? str2 : str1 //使用factor先存储str1和str2中的较短者// console.log(factor, 'factor')while (factor.length) {console.log(str1.split(factor), " str1.split(factor)")console.log(str2.split(factor), " str2.split(factor)")// 判断如果str1 和str2 都能被factor所分隔则这时的factor就是正确答案if (str1.split(factor).every(e => e === '') &&str2.split(factor).every(e => e === '') //split是将字符串根据传入的内容进行分隔存放到一个数组中 // "abc".split('b')=>['a','c']   "abbbc".split('b')=> ['a', '', '', 'c']// every是遍历数组中的每个元素如果都满足传入的函数的要求则返回true 否则false) {return factor}factor = factor.slice(0, -1)//截取factor 每次删除factor字符串中的最后一个元素console.log(factor, "factor")}return '' //如果循环结束了还没有返回,则没有找到符合条件的factor 返回空字符串}console.log(gcdOfStrings("ABABAB", "ABAB"))console.log("abbbc".split('b'));

运行结果

在这里插入图片描述

方法三:暴力仿求最大公因子的辗转相除法

源码版

var gcdOfStrings = function (str1, str2) {if (str1 + str2 !== str2 + str1) return ''return strGcb(str1, str2)}
function strGcb(a, b) {return (a.split(b).every(e => e === '')) ? b : strGcb(b, a.split(b).filter(e => { if (e !== '') { return e } }).join())
}

解析版

 var gcdOfStrings = function (str1, str2) {if (str1 + str2 !== str2 + str1) return '' //首先判断str1 str2是否有最大公因数 return strGcb(str1, str2)}function strGcb (a, b) {return (a.split(b).every(e => e === '')) ? b : strGcb(b, a.split(b).filter(e => { if (e !== '') { return e } }).join())// a % b === 0 ? b : isgy(b, a % b)  上一行代码是比着这个写出来的// a.split(b).every(e => e === ''))  这个等价于 a%b===0 // split是将字符串根据传入的内容进行分隔存放到一个数组中 // "abc".split('b')=>['a','c']   "abbbc".split('b')=> ['a', '', '', 'c']// every是遍历数组中的每个元素如果都满足传入的函数的要求则返回true 否则false// a.split(b).filter(e => { if (e !== '') { return e } }).join() 等价于 a % b// filter() 遍历数组 得到满足条件的返回值 返回一个新数组 // join() 将数组的每一项 用传入的值作为分隔符 拼接成一个字符串}

运行结果

在这里插入图片描述

这篇关于Leetcode1071. 字符串的最大公因子(三种方法,带详细解析)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/3024

相关文章

Python pandas库自学超详细教程

《Pythonpandas库自学超详细教程》文章介绍了Pandas库的基本功能、安装方法及核心操作,涵盖数据导入(CSV/Excel等)、数据结构(Series、DataFrame)、数据清洗、转换... 目录一、什么是Pandas库(1)、Pandas 应用(2)、Pandas 功能(3)、数据结构二、安

深度解析Spring Security 中的 SecurityFilterChain核心功能

《深度解析SpringSecurity中的SecurityFilterChain核心功能》SecurityFilterChain通过组件化配置、类型安全路径匹配、多链协同三大特性,重构了Spri... 目录Spring Security 中的SecurityFilterChain深度解析一、Security

Python安装Pandas库的两种方法

《Python安装Pandas库的两种方法》本文介绍了三种安装PythonPandas库的方法,通过cmd命令行安装并解决版本冲突,手动下载whl文件安装,更换国内镜像源加速下载,最后建议用pipli... 目录方法一:cmd命令行执行pip install pandas方法二:找到pandas下载库,然后

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1

Apache Ignite 与 Spring Boot 集成详细指南

《ApacheIgnite与SpringBoot集成详细指南》ApacheIgnite官方指南详解如何通过SpringBootStarter扩展实现自动配置,支持厚/轻客户端模式,简化Ign... 目录 一、背景:为什么需要这个集成? 二、两种集成方式(对应两种客户端模型) 三、方式一:自动配置 Thick

全面解析Golang 中的 Gorilla CORS 中间件正确用法

《全面解析Golang中的GorillaCORS中间件正确用法》Golang中使用gorilla/mux路由器配合rs/cors中间件库可以优雅地解决这个问题,然而,很多人刚开始使用时会遇到配... 目录如何让 golang 中的 Gorilla CORS 中间件正确工作一、基础依赖二、错误用法(很多人一开

Mysql中设计数据表的过程解析

《Mysql中设计数据表的过程解析》数据库约束通过NOTNULL、UNIQUE、DEFAULT、主键和外键等规则保障数据完整性,自动校验数据,减少人工错误,提升数据一致性和业务逻辑严谨性,本文介绍My... 目录1.引言2.NOT NULL——制定某列不可以存储NULL值2.UNIQUE——保证某一列的每一

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

Python对接支付宝支付之使用AliPay实现的详细操作指南

《Python对接支付宝支付之使用AliPay实现的详细操作指南》支付宝没有提供PythonSDK,但是强大的github就有提供python-alipay-sdk,封装里很多复杂操作,使用这个我们就... 目录一、引言二、准备工作2.1 支付宝开放平台入驻与应用创建2.2 密钥生成与配置2.3 安装ali

C# $字符串插值的使用

《C#$字符串插值的使用》本文介绍了C#中的字符串插值功能,详细介绍了使用$符号的实现方式,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录$ 字符使用方式创建内插字符串包含不同的数据类型控制内插表达式的格式控制内插表达式的对齐方式内插表达式中使用转义序列内插表达式中使用