美文网首页
2020-03-12 刷题1(字符串公因子)

2020-03-12 刷题1(字符串公因子)

作者: nowherespyfly | 来源:发表于2020-03-13 13:20 被阅读0次

    1071 字符串的最大公因子

    标签:字符串,公约数
    解法一:类似于最大公因数的更相减损法,两个数num1,num2(假设num1>=num2),两个数相等,则最大公因数就是它们自己,否则,num1和num2的最大公因数就等于num2和num1-num2的最大公因数。依次递归下去,直到两个数相等,就找到了最大公因数。
    迁移到字符串上,如果两个字符串相同,则最大公因子就是它们自己,否则,最大公因子就是短串和长串减短串的最大公因子。依次递归,直到两个串完全相同。

    class Solution {
    public:
        string gcdOfStrings(string str1, string str2) {
            // boundary
            if(str1.size() == str2.size()){
                if(str1 == str2) return str1;
                return "";
            }
            string strl, strs;
            if(str1.size() > str2.size()){
                strl = str1;
                strs = str2;
            }
            else{
                strl = str2;
                strs = str1;
            }
            if(strl.find(strs) != 0) return "";
            string sub = strl.substr(strs.size());
            return gcdOfStrings(strs, sub);
        }
    };
    

    解法二:数学法
    如果两个字符串str1和str2,str1+str2=str2+str1,也就是两种拼法,得到的结果一样,那他们一定有公因子;得到结果不相等,就一定没有公因子。最大公因子的长度就是它们长度的最大公约数。所以,如果存在公因子,求取长度为最大公约数的前缀即可。

    class Solution {
    public:
        string gcdOfStrings(string str1, string str2) {
            if(str1 + str2 != str2 + str1) return "";
            return str1.substr(0, __gcd(str1.size(), str2.size()));
        }
    };
    

    证明的话,两种情况,一种情况下,短的字符串的长度是长字符串的长度的因数,这种情况下,短字符串就是公因子;另一种情况,短字符串的长度不是长字符串的长度的因数,通过交换两个字符串的位置,长字符串的长度为(l1-l2)的前缀与长度为l1-l2的后缀相同;长度为l2的前缀与l2的后缀相同。所以长度为l2和l1-l2的最大公约数的前缀,就是两个字符串的最大公因子。

    相关文章

      网友评论

          本文标题:2020-03-12 刷题1(字符串公因子)

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