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

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

 其他系列文章导航

Java基础合集

数据结构与算法合集

设计模式合集

多线程合集

分布式合集

ES合集


文章目录

其他系列文章导航

文章目录

前言

一、题目描述

二、题解

2.1 方法一:辗转处理

2.2 方法二:gcd 算法

三、代码

3.1 方法一:辗转处理

3.2 方法二:gcd 算法

四、复杂度分析


前言

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


一、题目描述

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

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

示例 1:

输入:str1 = "ABCABC", str2 = "ABC"

输出:"ABC"


示例 2:

输入:str1 = "ABABAB", str2 = "ABAB"

输出:"AB"


示例 3:

输入:str1 = "LEET", str2 = "CODE"

输出:""


提示:

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

    二、题解

    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);
            }
        }

        image.gif

        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);
            }
        };

        image.gif

        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);
            }
        }

        image.gif

        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);
          }
        };

        image.gif


        四、复杂度分析

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

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

        目录
        相关文章
        |
        2月前
        |
        算法 数据处理 C语言
        C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合
        本文深入解析了C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合,旨在帮助读者掌握这一高效的数据处理方法。
        51 1
        |
        2月前
        |
        机器学习/深度学习 算法 数据挖掘
        K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构
        K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构。本文介绍了K-means算法的基本原理,包括初始化、数据点分配与簇中心更新等步骤,以及如何在Python中实现该算法,最后讨论了其优缺点及应用场景。
        137 4
        |
        13天前
        |
        存储 运维 监控
        探索局域网电脑监控软件:Python算法与数据结构的巧妙结合
        在数字化时代,局域网电脑监控软件成为企业管理和IT运维的重要工具,确保数据安全和网络稳定。本文探讨其背后的关键技术——Python中的算法与数据结构,如字典用于高效存储设备信息,以及数据收集、异常检测和聚合算法提升监控效率。通过Python代码示例,展示了如何实现基本监控功能,帮助读者理解其工作原理并激发技术兴趣。
        50 20
        |
        2月前
        |
        存储 算法 搜索推荐
        Python 中数据结构和算法的关系
        数据结构是算法的载体,算法是对数据结构的操作和运用。它们共同构成了计算机程序的核心,对于提高程序的质量和性能具有至关重要的作用
        |
        2月前
        |
        数据采集 存储 算法
        Python 中的数据结构和算法优化策略
        Python中的数据结构和算法如何进行优化?
        |
        2月前
        |
        算法
        数据结构之路由表查找算法(深度优先搜索和宽度优先搜索)
        在网络通信中,路由表用于指导数据包的传输路径。本文介绍了两种常用的路由表查找算法——深度优先算法(DFS)和宽度优先算法(BFS)。DFS使用栈实现,适合路径问题;BFS使用队列,保证找到最短路径。两者均能有效查找路由信息,但适用场景不同,需根据具体需求选择。文中还提供了这两种算法的核心代码及测试结果,验证了算法的有效性。
        112 23
        |
        2月前
        |
        算法
        数据结构之蜜蜂算法
        蜜蜂算法是一种受蜜蜂觅食行为启发的优化算法,通过模拟蜜蜂的群体智能来解决优化问题。本文介绍了蜜蜂算法的基本原理、数据结构设计、核心代码实现及算法优缺点。算法通过迭代更新蜜蜂位置,逐步优化适应度,最终找到问题的最优解。代码实现了单链表结构,用于管理蜜蜂节点,并通过适应度计算、节点移动等操作实现算法的核心功能。蜜蜂算法具有全局寻优能力强、参数设置简单等优点,但也存在对初始化参数敏感、计算复杂度高等缺点。
        64 20
        |
        2月前
        |
        并行计算 算法 测试技术
        C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
        C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
        65 1
        |
        12天前
        |
        机器学习/深度学习 算法
        基于改进遗传优化的BP神经网络金融序列预测算法matlab仿真
        本项目基于改进遗传优化的BP神经网络进行金融序列预测,使用MATLAB2022A实现。通过对比BP神经网络、遗传优化BP神经网络及改进遗传优化BP神经网络,展示了三者的误差和预测曲线差异。核心程序结合遗传算法(GA)与BP神经网络,利用GA优化BP网络的初始权重和阈值,提高预测精度。GA通过选择、交叉、变异操作迭代优化,防止局部收敛,增强模型对金融市场复杂性和不确定性的适应能力。
        145 80
        |
        5天前
        |
        机器学习/深度学习 算法
        基于遗传优化的双BP神经网络金融序列预测算法matlab仿真
        本项目基于遗传优化的双BP神经网络实现金融序列预测,使用MATLAB2022A进行仿真。算法通过两个初始学习率不同的BP神经网络(e1, e2)协同工作,结合遗传算法优化,提高预测精度。实验展示了三个算法的误差对比结果,验证了该方法的有效性。