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

01 看题和准备

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

返回最大的字符串X,使得X除以str1X除以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 第一种解法

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

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

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

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

思路:借助字符串拆分。用不同的子串分别对str1str2进行拆分,通过Stringsplit方法实现,如果拆分后的字符串数组中没剩下任何元素,表明可以被该子串整除。找到两字符串中长度较小的,作为循环次数上限,从后往前依次截取子串,将截取出来的子串用来拆分str1str2,如果拆分后得到的数组长度为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 第二种解法

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

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+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

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

LeetCode.1071-字符串最大公约数(Greatest Common Divisor of Strings)的更多相关文章

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

    1071. 字符串的最大公因子 1071. Greatest Common Divisor of Strings 题目描述 对于字符串 S 和 T,只有在 S = T + ... + T(T 与自身连 ...

  2. [Swift]LeetCode1071.字符串的最大公因子 | Greatest Common Divisor of Strings

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  3. leetcode 1071 Greatest Common Divisor of Strings

    lc1071 Greatest Common Divisor of Strings 找两个字符串的最长公共子串 假设:str1.length > str2.length 因为是公共子串,所以st ...

  4. 【Leetcode_easy】1071. Greatest Common Divisor of Strings

    problem 1071. Greatest Common Divisor of Strings solution class Solution { public: string gcdOfStrin ...

  5. 【LeetCode】1071. Greatest Common Divisor of Strings 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 暴力遍历 日期 题目地址:https://leetc ...

  6. 【leetcode】1071. Greatest Common Divisor of Strings

    题目如下: For strings S and T, we say "T divides S" if and only if S = T + ... + T  (T concate ...

  7. 最大公约数Greatest Common Divisor(GCD)

    一 暴力枚举法 原理:试图寻找一个合适的整数i,看看这个整数能否被两个整形参数numberA和numberB同时整除.这个整数i从2开始循环累加,一直累加到numberA和numberB中较小参数的一 ...

  8. 最大公约数和最小公倍数(Greatest Common Divisor and Least Common Multiple)

    定义: 最大公约数(英语:greatest common divisor,gcd).是数学词汇,指能够整除多个整数的最大正整数.而多个整数不能都为零.例如8和12的最大公因数为4. 最小公倍数是数论中 ...

  9. 845. Greatest Common Divisor

    描述 Given two numbers, number a and number b. Find the greatest common divisor of the given two numbe ...

随机推荐

  1. zeromq实践

    zeromq简介 zeroMQ不是TCP,不是socket,也不是消息队列,而是这些的综合体. ZeroMQ以嵌入式网络编程库的形式实现了一个并行开发框架(concurrency framework) ...

  2. 你还不知道这款VCL界面开发工具?DevExpress VCL v19.1.6来袭

    DevExpress VCL Controls是 Devexpress公司旗下最老牌的用户界面套包.所包含的控件有:数据录入,图表,数据分析,导航,布局,网格,日程管理,样式,打印和工作流等,让您快速 ...

  3. static和assets的区别

    assets和static两个都是用于存放静态资源文件. 放在static中的文件不会进行构建编译处理,也就不会压缩体积,在打包时效率会更高,但体积更大在服务器中就会占据更大的空间 放在assets中 ...

  4. 一些需要禁用的PHP危险函数(disable_functions)

    一些需要禁用的PHP危险函数(disable_functions)   有时候为了安全我们需要禁掉一些PHP危险函数,整理如下需要的朋友可以参考下 phpinfo() 功能描述:输出 PHP 环境信息 ...

  5. 【Winform-自定义控件】自定义Tab Control 带关闭符号(X)的标签页

    a form & a tabControl 思路: DrawMode设一定要设为OwnerDrawFixed 事件:Form_Load.tabControl1_DrawItem.tabCont ...

  6. vue项目,百度地图api高亮选取区域,高亮某个地区,行政区域等

    效果如下: var blist = [] ,maxZoom: });// 创建地图实例 var point = new window.BMap.Point(89.48,31.57); map.cent ...

  7. mysql优化(上)

    磁盘组成  和  磁盘读取过程 尽量减少 i/o 操作. 表结构设计:(1)三范式 :   原子性(不可拆分).唯一性(不能有完全相同的数据).无冗余性(不能有多余的数据),对于冗余性说明一下:拿订单 ...

  8. ZOJ - 3715贪心

    ZOJ - 3715KindergartenElection 题目大意:幼儿园里正在举办班长选举,除1号小朋友外每个人都会投他最好的朋友,但1号小朋友可以贿赂别人(小伙子有丶想法),被贿赂的小朋友就会 ...

  9. js获取用户当前页面复制的内容并修改

    如果只是单纯的获取页面上复制的内容可以使用window.getSelection()来获取选中的内容,在执行复制操作就可以了,但是如果想修改复制的内容可以先获取要复制的内容修改之后再用document ...

  10. 如何卸载zabbix且删除

    1.彻底卸载zabbix和删除残留文件 1 2   [root@localhost etc]# service zabbix stop   //这个命令是停止服务 [root@localhost et ...