1071. 字符串的最大公因子
来源第 139 场周赛 Q1难度简单分数1397
题目描述
对于字符串 s 和 t,只有在 s = t + t + t + ... + t + t(t 自身连接 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"
输出:""
示例 4:
输入:str1 = "AAAAAB", str2 = "AAA"
输出:""
提示:
1 <= str1.length, str2.length <= 1000str1和str2由大写英文字母组成
解法
方法一:枚举
思考
公因子串必须能整段重复拼出两个原串,长度必为两串长度的公约数。从较短长度向下枚举前缀,拼回去检查即可,\(m,n\le 1000\)。
对每个候选 \(t=\textit{str1}[:i]\),反复拼接直到长度达到目标串,再比较是否相等。
第一个同时覆盖两串的 \(t\) 就是最长公因子;若都不行则返回空串。
从较短串的长度开始向下枚举候选前缀 \(t\),检查将 \(t\) 重复拼接后能否分别得到 \(\textit{str1}\) 和 \(\textit{str2}\)。第一个满足条件的 \(t\) 即为最长公因子串。
时间复杂度 \(O((m + n) \times \min(m, n))\),空间复杂度 \(O(m + n)\)。其中 \(m\) 和 \(n\) 分别为两个字符串的长度。
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
方法二:数学
思考
枚举仍要按长度尝试多种前缀。若存在公因子,则 \(s_1+s_2=s_2+s_1\),且最长因子长度恰为 \(\gcd(|s_1|,|s_2|)\)。
先判断拼接交换是否相等,再直接取 \(s_1\) 的前 \(\gcd\) 个字符,省去逐长度验证。
若存在公因子串,则 \(s_1+s_2=s_2+s_1\)。此时最长公因子串的长度等于 \(\gcd(|s_1|,|s_2|)\)。
时间复杂度 \(O(m + n)\),空间复杂度 \(O(m + n)\)。其中 \(m\) 和 \(n\) 分别为两个字符串的长度。
1 2 3 4 5 6 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
1 2 3 4 5 6 7 8 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |