LeetCode刷題: 【1071】字符串的最大公因子(輾轉相除法)

1. 題目

在這裏插入圖片描述

2. 解題思路

滿足題目要求的子串長度爲兩個字符串長度的最大公因數gcd
計算最大公因數gcd,若兩個字符串以gcd爲週期,且前gcd字符相同
則前gcd字符爲題解
PS: 如果str1 + str2 == str2 + str1則一定有公因子

輾轉相除法:
兩個數的最大公約數等於它們中較小的數和兩數之差的最大公約數。

3. 代碼

class Solution {
public:
    string gcdOfStrings(string str1, string str2) {
        int gcd = 0;
        int a = str1.size();
        int b = str2.size();
        // 輾轉相除法
        while(a != b){
            // cout<<a<<" "<<b<<endl;
            if(a < b){
                b = b - a;
            }else if(a > b){
                b = a - b;
                a = - (b - a);
            }
        }
        // 最大公因數
        gcd = a;
        // cout<<gcd<<endl;
        // 校驗
        // for(int i = 0; i < gcd; i++){
        //     if(str1[i] != str2[i]){
        //         return "";
        //     }
        // }
        // for(int i = gcd; i < str1.size(); i++){
        //     if(str1[i] != str1[i - a]){
        //         return "";
        //     }
        // }
        // for(int i = gcd; i < str2.size(); i++){
        //     if(str2[i] != str2[i - a]){
        //         return "";
        //     }
        // }
        
        if(str1 + str2 != str2 + str1){
            return "";
        }

        return str1.substr(0, gcd);
    }
};

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章