美文网首页
1071. 字符串的最大公因子

1071. 字符串的最大公因子

作者: 阿星啊阿星 | 来源:发表于2020-03-12 13:01 被阅读0次

    字符串的最大公因子

    题目描述

    对于字符串 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] 为大写英文字母

    转载来源:力扣(LeetCode)


    题目分析

    字符串的题目是我的弱项,但这道题我比较快的有了思路,并且一次就AC了,在我沾沾自喜的时候,AC结果显示我超越了20%的用户......

    国际惯例,落后就去抄袭,下面我就介绍一下我自己的算法和排在前列的算法:

    • 华而不实的算法

      • 先确保str1短于str2,
      • 如果str1和str2等长且相等,显然最大公因子就是自身,如果str1和str2等长且内容不等,显然没结果
      • str1短于str2,str2就砍掉str1长度,用剩下的子串和str1继续寻找公因子
      fun gcdOfStrings(str1: String, str2: String): String {
          if(str1.length > str2.length)
              return gcdOfStrings(str2,str1)
          if(str1.length == str2.length)
              when(str1 == str2){
                  true->return str1
                  false->return ""
              }
          val tmp = str2.substring(str1.length)
          return gcdOfStrings(str1,tmp)
      }
      

      真的是思路清晰且代码简练啊,但是和下面优秀的算法相比有致命的缺点:

      1. 字符串比较次数过多,耗时
      2. 字符串截取次数过多,耗时

      下面就介绍优秀的算法吧(留下不争气的泪水)

    • 欧几里得算法
      显然,如果str1和str2有最大公因子X,那么str1可表示为AX,str2可表示为BX,str1+str2 == str2+str1 == (A+B)X (这里是字符串的相等)

    1. 根据上面的定理,可以直接确定str1和str2是否有最大公因子:

              if(str1+str2 != str2+str1)
                  return ""
      
    2. 现在我们确保了X是存在的,那么就要求X究竟是什么(其实我们只要求出X的长度就行了,不需要求出X的具体的值,因为str1和str2都是由X构成的),X的长度实际上就是str1的长度和str2的长度的最大公因子,求最大公因子的算法我们在小学初中就接触过,叫“欧几里得算法”,也叫“辗转相除法”

          //默认len1 > len2
          fun gcd(len1: Int, len2: Int): Int {
              if(len2 == 0)
                  return len1
              return gcd(len2,len1%len2)
          }
      
    3. 得到X的长度后,我们就可以用subString轻松求出X来了

          fun gcdOfStrings(str1: String, str2: String): String {
              if (str1 + str2 != str2 + str1)
                  return ""
              val size = when(str1.length > str2.length){
                  true->gcd(str1.length, str2.length)
                  false->gcd(str2.length, str1.length)
              }
              return str1.substring(0,size)
          }
      

    今天,又是充满被虐的一天~

    相关文章

      网友评论

          本文标题:1071. 字符串的最大公因子

          本文链接:https://www.haomeiwen.com/subject/ntdujhtx.html