LeetCode.1071-字符串最大公约数(Greatest Common Divisor of Strings)

LeetCode --- 1071. Greatest Common Divisor of Strings 解题报告 For two stringssandt, we say "tdividess" if and only ifs = t + ... + t(i.e.,tis concatenated with itself one or more times). Given two stringsstr1andstr2, returnthe largest stringxsuch thatxdivides bothstr1andstr2. Example 1: Inpu... 阅读详情

这是小川的第391次更新,第421篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第253题(顺位题号是1071)。对于字符串S和T,当且仅当S = T + ... + T(T与自身连接1次或更多次)时,我们说"T除S"。

返回最大的字符串X,使得X除以str1,X除以str2。

例如:

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

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

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

注意:

  • 1 <= str1.length <= 1000

  • 1 <= str2.length <= 1000

  • str1[i]和str2[i]是英文大写字母。

02 第一种解法

题目的要求是找出两个字符串str1、str2的最大公约数,即str1、str2中都存在一个子串,并且都由这个子串重复出现一次或多次组成。

那么,什么情况下这两字符串没有最大公约数?

两者分别前后拼接,但是不相等,那么肯定不存在最大公约数。例如示例中的str1 ="ABCABC",str2 ="ABC",str1拼接str2后变成"ABCABCABC",str2拼接str1后变成"ABCABCABC"。而str1 ="LEET",str2 ="CODE",str1拼接str2后变成"LEETCODE",str2拼接str1后变成"CODELEET",两者显然不相等,肯定不存在公约数。

那怎么找到他们的最大公约数呢?

思路:借助字符串拆分。用不同的子串分别对str1和str2进行拆分,通过String的split方法实现,如果拆分后的字符串数组中没剩下任何元素,表明可以被该子串整除。找到两字符串中长度较小的,作为循环次数上限,从后往前依次截取子串,将截取出来的子串用来拆分str1和str2,如果拆分后得到的数组长度为0,则此子串就是最大公约数。

public String gcdOfStrings(String str1, String str2) {
    if (!(str1+str2).equals(str2+str1)) {
        return "";
    }
    int n = Math.min(str1.length(), str2.length());
    for (int i=n; i>=1; i--) {
        String temp = str2.substring(0, i);
        if (str2.split(temp).length == 0 && 
                str1.split(temp).length == 0) {
            return temp;
        }
    }
    return "";
}

03 第二种解法

和第一种解法思路类似,依旧是借助字符串的特性,使用替换来验证最大公约数,通过String的replaceAll方法实现。

public String gcdOfStrings2(String str1, String str2) {
    if (!(str1+str2).equals(str2+str1)) {
        return "";
    }
    int n = Math.min(str1.length(), str2.length());
    for (int i=n; i>=1; i--) {
        if (n%i != 0) {
            continue;
        }
        String temp = str2.substring(0, i);
        if(str1.replaceAll(temp,"").equals("") && 
                str2.replaceAll(temp,"").equals("")) {
            return temp;
        }
    }
    return "";
}

04 第三种解法

我们还可以从数学角度来思考这个问题。

思路:将两个字符串的长度看做求最大公约数的两个整数,单独写一个求两个数最大公约数的算法,算出最大公约数后,取两字符串中长度较小的,截取子串,子串的长度就是前一步算出的最大公约数,该子串也就是我们最后要返回的两字符串的最大公约数。

public String gcdOfStrings3(String str1, String str2) {
    if (!(str1+str2).equals(str2+str1)) {
        return "";
    }
    int len = str1.length();
    int len2 = str2.length();
    int gcd = GCD(len, len2);
    if (len < len2) {
        return str1.substring(0, gcd);
    }
    return str2.substring(0, gcd);
}


public int GCD(int a, int b) {
    if (b == 0) {
        return a;
    }
    return a % b == 0 ? b : GCD(b, a % b);
}

05 第四种解法

我们还可以将第三种解法中用到的求最大公约数的递归方法,和字符串操作整合在一起。

找到两个字符串中长度较大的那个,如果长度大的字符串包含较小长度字符串的所有字符,就用长度较小的字符串对较大中的子串进行替换,直到有一方为空串为止。

public String gcdOfStrings4(String str1, String str2) {
    if (str1.length() < str2.length()) {
        return gcdOfStrings4(str2, str1);
    }
    if (str2.isEmpty()) {
        return str1;
    }
    if (!str1.contains(str2)) {
        return "";
    }
    str1 = str1.replace(str2, "");
    return gcdOfStrings4(str2, str1);
}

06 小结

算法专题目前已连续日更超过七个月,算法题文章259+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

【光子 AI 】LangGraph:Graph = 有向有环图 + 状态机实现原理详解:数据结构模型与核心算法代码实现逻辑解析 LangGraph核心原理解析:基于Pregel模型的消息传递图,结合有向有环图和状态机特性。关键实现包括:1) 共享状态机制(TypedDict/Pydantic模型)配合Reducer逻辑实现状态更新;2) 图拓扑结构通过邻接表维护节点和条件边;3) 检查点机制支持状态持久化和恢复。运行时采用Pregel循环算法,通过超级步迭代执行节点函数、应用状态归约、条件路由下一批节点,同时支持人工中断和异步并行处理。该架构使LangGraph具备循环执行、条件跳转等DAG无法实现的动态流程控制能力。 阅读详情

相关推荐

SAP PS项目计划成本与预算设计:从概念到可用性控制详解

在项目管理中,成本计划与预算管控是决定项目成本能否受控的两个核心概念。成本计划反映“预计花费”,预算是“授权上限”,两者在WBS结构上既相互关联又彼此独立。SAP PS通过计划版本管理不同口径的估算,并借助可用性控制机制对采购申请、采购订单等业务操作进行事前拦截与提示,从而实现从“事后追认”到“事前控制”的转变。理解计划成本作为预算基线、预算作为控制阀门的原理,能够帮助实施顾问和项目管理者合理设计项目财务流程。在大型工程、研发或总包项目中,明确WBS层级、预算对象和检查规则,可有效避免超支风险。围绕SAP

weixin_33146151的博客 361

黑马程序员——求两个字符串最大公约数的解法

题目:键盘输入两个字符串,获取这两个字符串的最大公约数并打印出来。例如:输入ijsfajk 和 qhsfqal ,输出的最大公约数是sf

codeting的博客 890

Fiddler everywhere的一些基础操作

网上能搜到的Fiddler everywhere使用教程太少,于是我整理了一些自己实操成功的内容,包括Fiddler everywhere的Mock测试、弱网测试等基础操作,后续还会持续更新。操作系统:macOS使用工具:Fiddler everywhere 5.10.0本文简单介绍了使用Fiddler everywhere进行的Mock测试和弱网测试,而Fiddler everywhere提供了更多的其他实用的功能,我会在后期进行一个持续的学习和更新。

weixin_44346646的博客 2480

【LeetCode 75】【学习笔记】字符串的最大公因子(Greatest Common Divisor of Strings)

对于字符串 s 和 t,只有在 s = t + ... + t(t 自身连接 1 次或多次)时,我们才认定 “t 能除尽 s”。 给定两个字符串 str1 和 str2 。返回 最长字符串 x,要求满足 x 能除尽 str1 且 x 能除尽 str2 。

Yo! This is Swordup. 1086

阿里云网络架构设计

背景 一个企业上云,首先要考虑整个网络的规划,涉及到云上和云下的网络规划,云上VPC的规划,云上不同地域VPC的互通,云上可用区的选择等等,所以一定要提前规划好整体的网络架构,现在阿里云云上的虚拟化网络解决方案已经完全转向 了云企业网,所以所有使用阿里云的企业客户多多少少都会使用阿里云的CEN 支撑自己的业务。 云企业网介绍 云企业网(Cloud Enterprise Network)是承载在阿里云提供的高性能、低延迟的私有全球网络上的一张高可用网络。 IDC专线接入CEN 首先面临的是云上和云下打通,那么

修电脑的码农 4842

Redis+QMT实战:如何用Stream模式实现聚宽策略的毫秒级跟单(附完整代码)

本文详细介绍了如何利用Redis Stream模式构建一个低延迟、高可靠的量化交易信号中继系统,实现从聚宽策略到本地QMT的毫秒级跟单。通过对比传统方案,解析了Redis Stream在消息持久化、消费组和显式确认方面的核心优势,并提供了完整的架构设计思路与核心代码实现,帮助量化开发者解决云端策略信号稳定传递至本地实盘的难题。

weixin_29280657的博客 478

Leetcode 1071 字符串的最大公约数

leetcode1071

zjshuster的博客 239

电路抗干扰原理及应用(1)

电路抗干扰原理——介绍干扰源、干扰途径、抗干扰技术(接地技术)

qq_34758408的博客 2068

LeetCode题解——最大公约数

题目描述: 如何求出最大公约数? 解法一: 暴力枚举法: 时间复杂度是O(min(a, b))。 1. public static int getGreatestCommonDivisor(int a, int b){ 2. int big = a>b ? a:b; 3. int small = a<b ? a:b; 4. if(big%small == 0){ 5. return s...

bigchen 1519

OpenGL ES 3.0 开发(一):绘制一个三角形

该原创文章首发于微信公众号:字节流动 什么是 OpenGLES OpenGLES 全称 OpenGL for Embedded Systems ,是三维图形应用程序接口 OpenGL 的子集,本质上是一个跨编程语言、跨平台的编程接口规范,主要应用于嵌入式设备,如手机、平板等。由科纳斯(Khronos)组织定义和推广,科纳斯是一个图形软硬件行业协会,该协会主要关注图形和多媒体方面的开放标准。 O...

字节流动 8万+

基于BERTopic模型的英文20新闻数据集主题聚类及可视化

BERTopic是基于深度学习的一种主题建模方法。BERT是一种用于NLP的预训练策略,它成功地利用了句子的深层语义信息。

Cachel Wood的博客 1461

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

使用三种方法,并带有详细解析解决字符串最大公因子问题

sinat_51673411的博客 1216

多径衰落信道的 MATLAB 仿真

在无线通信系统中,信号在传输过程中会经历多径传播现象,导致信号在接收端出现时域和频域上的扩展。通过以上示例代码,我们可以进行多径衰落信道的 MATLAB 仿真。同时,我们还可以通过调整信道参数和信号特性,进一步研究多径衰落对系统性能的影响。常用的模型之一是瑞利衰落信道模型,它假设信号在传输过程中受到多个散射路径的影响。除了瑞利衰落信道模型,我们还可以使用其他类型的信道模型,如高斯衰落信道模型。在上述代码中,我们首先定义了信道的参数,包括最大多普勒频移、多径延迟和多径功率衰落。函数来模拟高斯衰落信道。

TechCraze的博客 666

leetcode 1071. Greatest Common Divisor of Strings(字符串的最大公约数)

leetcode 1071

蓝羽飞鸟的博客 551

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

LeetCode-3.12-1071-E-字符串的最大公共因子/最大公约数(Greatest Common Divisor of Strings)

文章目录思路解法 对于字符串 S 和 T,只有在 S = T + … + T(T 与自身连接 1 次或多次)时,我们才认定 “T 能除尽 S”。 返回最长字符串 X,要求满足 X 能除尽 str1 且 X 能除尽 str2。 示例 1: 输入:str1 = “ABCABC”, str2 = “ABC” 输出:“ABC” 示例 2: 输入:str1 = “ABABAB”, str2 = “ABAB...

Heorin X的博客 211

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

LeetCode | 1071. Greatest Common Divisor of Strings字符串的最大公因子【Python】

LeetCode 1071. Greatest Common Divisor of Strings字符串的最大公因子【Easy】【Python】【字符串】 Problem LeetCode For strings S and T, we say "T divides S" if and only if S = T + ... + T (T concatenated with itself 1 ...

Wonz 702

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Leetcode 1071.字符串的最大公因子(Greatest Common Divisor of Strings)

Leetcode 1071.字符串的最大公因子 1 题目描述(Leetcode题目链接)   对于字符串 SSS 和 TTT,只有在 S=T+...+TS = T + ... + TS=T+...+T(TTT 与自身连接 1 次或多次)时,我们才认定 “TTT 能除尽 SSS”。 返回最长字符串 X,要求满足 X 能除尽 str1 且 X 能除尽 str2。 输入:str1 = "ABCABC",...

qq_39378221的博客 670

【LeetCode】 1071. Greatest Common Divisor of Strings 字符串的最大公因子(Easy)(JAVA)

【LeetCode】 1071. Greatest Common Divisor of Strings 字符串的最大公因子(Easy)(JAVA) 题目地址: https://leetcode.com/problems/greatest-common-divisor-of-strings/ 题目描述: For strings S and T, we say “T divides S” if and...

qq_16927853的博客 337

【Leetcode】1071. Greatest Common Divisor of Strings(最大公约字符串)

For stringsSandT, we say "TdividesS" if and only ifS = T + ... + T (Tconcatenated with itself 1 or more times) Return the largest stringXsuch thatXdividesstr1andXdividesstr2. Exa...

小I的博客 636

[leetcode] 1071. Greatest Common Divisor of Strings

Description For two strings s and t, we say “t divides s” if and only if s = t + … + t (t concatenated with itself 1 or more times) Given two strings str1 and str2, return the largest string x such that x divides both str1 and str2. Example 1: Input: str1

Learning from the mistakes 206

【Leetcode】1071. Greatest Common Divisor of Strings(配数学证明)

题目地址: https://leetcode.com/problems/greatest-common-divisor-of-strings/ 给定两个字符串sss和ttt,如果存在字符串xxx使得s=x+x+...+xs=x+x+...+xs=x+x+...+x并且t=x+x+...+xt=x+x+...+xt=x+x+...+x,也就是说sss和ttt都可以分割为某个相同字符串的拼接,那就返回最长满足条件的xxx,否则返回空串。题目要求分割出xxx的出现次数要大于等于111,也就是说不能分出空串。我们可

数学、算法爱好者的博客 392

LeetCode 1071. Greatest Common Divisor of Strings C++

Problem 题目链接 Solution 题意为:给定字符串str1,str2,找出这两字符串的最大的公共循环节 例如ababab和ab的最大公共循环节是ab abababab和abab的最大公共循环节abab 那么,若str1和str2存在公共循环节,那么str1和str2的最小循环节应该是相同的 例如 abababab和abab的最小循环节都是ab,那么它们之间必定存在公共循环节 那么由最小循环节相同我们可以知道 str1+str2==str2+str1 否则肯定不存在公共循环节 那么怎么求最大公共循

dong的博客 271

leetcode 1071. Greatest Common Divisor of Strings 字符串的最大公因子 辗转相除法

leetcode 1071. Greatest Common Divisor of Strings 字符串的最大公因子 辗转相除法 leetcode 2020年3月 每日一题打卡 辗转相除法请看https://blog.csdn.net/weixin_43973433/article/details/105007066 题目: 对于字符串 S 和 T,只有在 S = T + … + T(T 与自身...

weixin_43973433的博客 232

LeetCode //C -1071. Greatest Common Divisor of Strings

This problem requires finding the largest string that divides both input strings str1 and str2, meaning both strings can be formed by repeating the divisor string. The solution involves checking if concatenating the strings in different orders produces the

Made in Code 446

leetcode 1071. Greatest Common Divisor of Strings

题目 class Solution { public String gcdOfStrings(String str1, String str2) { if(!(str1+str2).equals(str2+str1)) return ""; int len = Math.min(str1.length(),str2.length()); fo...

xiaobailaji的博客 185

算法练习-LeetCode1071. Greatest Common Divisor of Strings

算法练习-LeetCode1071. Greatest Common Divisor of Strings

qq_41758969的博客 614
上一篇: LeetCode.1051-身高检查器(Height Checker)
下一篇: LeetCode.1078-两词出现后的单词(Occurrences After Bigram)
程序员小川
博客等级 码龄10年 47粉丝 305原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值