【数据结构和算法】字符串的最大公因子

其他系列文章导航

Java基础合集
数据结构与算法合集

设计模式合集

多线程合集

分布式合集

ES合集


文章目录

其他系列文章导航

文章目录

前言

一、题目描述

二、题解

2.1 方法一:辗转处理

2.2 方法二:gcd 算法

三、代码

3.1 方法一:辗转处理

3.2 方法二:gcd 算法

四、复杂度分析


前言

这是力扣的1071题,难度为简单,解题方案有很多种,本文讲解我认为最奇妙的两种。


一、题目描述

对于字符串 s 和 t,只有在 s = t + ... + tt 自身连接 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 由大写英文字母组成

二、题解

2.1 方法一:辗转处理

思路与算法:

我们可以把str1看作n个T,str2看作m个T。

str1+str2=(m+n)T=(n+m)T=str2+str1

然后我们保证str1的长度大于str2,str1每次减掉个str2,最后保证str2为" "就可以了。

如果最后或者过程中,str1不等于str2,则没有最大公因子

第一种情况例如:

  1. ABCABC      ABC  减一次
  2. ABC             ABC  减第二次
  3. " "                ABC  保证str1的长度大于str2
  4. ABC             " "     ------->ABC

 第二种情况例如:

  1. ABABAB        ABAB  减一次
  2. AB                 ABAB  保证str1的长度大于str2
  3. ABAB             AB      减第二次
  4. AB                  AB     减第三次
  5. " "                   AB      保证str1的长度大于str2
  6. AB                   " "      ------->ABC

2.2 方法二:gcd 算法

gcd 算法:const gcd = (a, b) => (0 === b ? a : gcd(b, a % b))

如果它们有公因子 abc,那么 str1 就是 m 个 abc 的重复,str2 是 n 个 abc 的重复,连起来就是 m+n个 abc,好像 m+n 个 abc 跟 n+m 个 abc 是一样的。

所以如果 str1 + str2 === str2 + str1 就意味着有解。

我们也很容易想到 str1 + str2 !== str2 + str1 也是无解的充要条件。

当确定有解的情况下,最优解是长度为 gcd(str1.length, str2.length) 的字符串。


三、代码

3.1 方法一:辗转处理

Java版本:

class Solution {
    public static void main(String[] args) {
        String str1 = "ABCDEF", str2 = "DEF";
        System.out.println(gcdOfStrings(str1, str2));
    }

    public static String gcdOfStrings(String str1, String str2) {
        if (str1.length() < str2.length()) return gcdOfStrings(str2, str1);//保证str1的长度大于str2
        if (str2.isEmpty()) return str1;//str1被删空后换位,则换位后的str1是最大公因子
        if (!str1.startsWith(str2)) return "";
        return gcdOfStrings(str1.substring(str2.length()), str2);
    }
}

C++版本:

class Solution {
public:
    static string gcdOfStrings(string str1, string str2) {
        if (str1.length() < str2.length()) return gcdOfStrings(str2, str1);//保证str1的长度大于str2
        if (str2.empty()) return str1;//str1被删空后换位,则换位后的str1是最大公因子
        if (str1.find(str2) != 0) return "";
        return gcdOfStrings(str1.substr(str2.length()), str2);
    }
};

3.2 方法二:gcd 算法

Java版本:

class Solution {
    public String gcdOfStrings(String str1, String str2) {
        if (!(str1 + str2).equals(str2 + str1)) return "";
        int len1 = str1.length();
        int len2 = str2.length();
        while (len1 != len2) {
            if (len1 > len2) {
                len1 -= len2;
            } else {
                len2 -= len1;
            }
        }
        return str1.substring(0, len1);
    }
}

C++: 

class Solution {
public:
  std::string gcdOfStrings(std::string str1, std::string str2) {
    if (str1 + str2 != str2 + str1) return "";
    int len1 = str1.length();
    int len2 = str2.length();
    while (len1 != len2) {
      if (len1 > len2) {
          len1 -= len2;
      } else {
          len2 -= len1;
      }
    }
    return str1.substr(0, len1);
  }
};

四、复杂度分析

时间复杂度:O(n) ,字符串拼接比较是否相等需要 O(n) 的时间复杂度,求两个字符串长度的最大公约数需要 O(log⁡n) 的时间复杂度,所以总时间复杂度为 O(n+log⁡n)=O(n) 。

空间复杂度:O(n) ,程序运行时建立了中间变量用来存储 str1 与 str2 的相加结果。


相关推荐

  1. 数据结构算法字符串因子

    2023-12-08 06:40:04       55 阅读
  2. 算法---字符串因子

    2023-12-08 06:40:04       57 阅读
  3. [leetcode] 1071. 字符串因子

    2023-12-08 06:40:04       34 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-08 06:40:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-08 06:40:04       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-08 06:40:04       82 阅读
  4. Python语言-面向对象

    2023-12-08 06:40:04       91 阅读

热门阅读

  1. 利用 Python 进行数据分析实验(四)

    2023-12-08 06:40:04       49 阅读
  2. Golang实践录:sqlite的使用

    2023-12-08 06:40:04       51 阅读
  3. Redis RedisHelper

    2023-12-08 06:40:04       54 阅读
  4. vue中对pdf文件和路径的处理

    2023-12-08 06:40:04       66 阅读
  5. C/C++---------------LeetCode第374. 猜数字大小

    2023-12-08 06:40:04       45 阅读
  6. 力扣199. 二叉树的右视图

    2023-12-08 06:40:04       54 阅读
  7. PostgreSQL 主键和唯一键的区别

    2023-12-08 06:40:04       55 阅读
  8. 安全快速地删除 MySQL 大表数据并释放空间

    2023-12-08 06:40:04       58 阅读
  9. excel xla文件怎么导入到excel

    2023-12-08 06:40:04       63 阅读
  10. 我的创作纪念日

    2023-12-08 06:40:04       70 阅读
  11. http状态码

    2023-12-08 06:40:04       61 阅读
  12. 单元测试Nunit的几种断言

    2023-12-08 06:40:04       54 阅读
  13. Hibernate更新多实体对象的坑

    2023-12-08 06:40:04       57 阅读