要求找到兩個字符串的最大公約數。最大公約數是指能夠同時整除兩個數字的最大正整數。 str2中的字串可以組成str1 思考 1.在string中兩個string是否能成為"有效"的公約字串 和在數字中找到最大公約數不同 條件為 (str1 + str2) == (str2 + str1)。這一步是確保 str1 和 str2 可以形成循環字符串 ```c++= if(str1 + str2 == str2 + str1) ``` 成立代表兩個string有相同的prefix(前綴) 才有可能成為有效的公約字串 Ex: str1 = ABCABC, str2 = ABC ABCABCABC == ABCABCABC 成立 gcd(6,3) = 3 最大可能公約數為三個 Ex: str1 = CODE str2 = LIFE CODELIFE != LIFECODE Ex: str1 = ABABABAB str2 = ABABA ABABAABABABAB != ABABABABABABA 2.從str1中拆解出最大可能前綴(0, 公因數), 從str1中擷取回傳 這裡使用了 C++ 的 __gcd 函數(內建函數)來計算 str1 和 str2 的長度的最大公因子,然後再使用 substr 函數取出 str1 的前 gcd 個字符作為結果。 ```c++= class Solution { public: string gcdOfStrings(string str1, string str2) { //先判斷兩個字串有沒有可能成為最大公因數 if(str1 + str2 == str2 + str1){ //擷取最大可能的prefix return str1.substr(0, __gcd(str1.size(), str2.size())); } return ""; } }; ``` ```c++= class Solution { public: string gcdOfStrings(string str1, string str2) { // 字串的最大公約數代表這個字串可以組成str1和str2 // s = t + t + t.... + t 也就是確保 循環字串 // 代表 s + t 和 t + s是要相等 if(str1 + str2 != str2 + str1){ return ""; }else{ //代表str1和str2是有公因字串的,最大公因字串的size可以整除兩個字串的size return str1.substr(0, __gcd(str1.size(), str2.size())); } } }; ``` ```= /** * @param {string} str1 * @param {string} str2 * @return {string} */ var gcdOfStrings = function(str1, str2) { // str1 可以被 str2 構造 // 要能持為循環才有機會 if(str1 + str2 != str2 + str1){ return ""; }else{ const n = gcd(str1.length, str2.length); console.log(n); return str1.substring(0, n) } function gcd(a, b){ if(b === 0){ return a; } return gcd(b, a % b); } }; ```