[LeetCode] 1071. Greatest Common Divisor of Strings

For two strings s and t, we say "t divides s" if and only if s = t + ... + t (i.e., t is concatenated with itself one 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 = "ABCABC", str2 = "ABC"
Output: "ABC"

Example 2:

Input: str1 = "ABABAB", str2 = "ABAB"
Output: "AB"

Example 3:

Input: str1 = "LEET", str2 = "CODE"
Output: ""

Constraints:

  • 1 <= str1.length, str2.length <= 1000
  • str1 and str2 consist of English uppercase letters.

字符串的最大公因子。

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

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

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/greatest-common-divisor-of-strings
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

这是一道数学题,说是求字符串的最大公因子,其实是需要先求出两个字符串长度的最大公约数然后得到子串。其中求最大公约数 gcd 的函数需要背下来。

注意题目的 corner case,如果两个字符串 A + B != B + A 的话,说明两者是没有公共子串的。

时间O(log min(a, b))

空间O(1)

Java实现

 1 class Solution {
 2     public String gcdOfStrings(String str1, String str2) {
 3         // corner case
 4         if (!str1.concat(str2).equals(str2.concat(str1))) {
 5             return "";
 6         }
 7         int gcdLength = helper(str1.length(), str2.length());
 8         return str1.substring(0, gcdLength);
 9     }
10     
11     private int helper(int a, int b) {
12         while (b != 0) {
13             int temp = b;
14             b = a % b;
15             a = temp;
16         }
17         return a;
18     }
19 }

 

我再提供递归实现寻找两个数的最大公约数的 helper 函数。

 1 class Solution {
 2     public String gcdOfStrings(String str1, String str2) {
 3         // corner case
 4         if (!str1.concat(str2).equals(str2.concat(str1))) {
 5             return "";
 6         }
 7         int gcdLength = helper(str1.length(), str2.length());
 8         return str1.substring(0, gcdLength);
 9     }
10 
11     private int helper(int a, int b) {
12         if (a == 0) {
13             return b;
14         }
15         if (b == 0) {
16             return a;
17         }
18         if (a == b) {
19             return a;
20         }
21         if (a > b) {
22             return helper(a - b, b);
23         }
24         return helper(b - a, a);
25     }
26 }

 

 

LeetCode 题目总结

posted @ 2023-06-27 14:44  CNoodle  阅读(100)  评论(0编辑  收藏  举报