对于字符串 S 和 T,只有在 S = T + ... + T(T 与自身连接 1 次或多次)时,我们才认定 “T 能除尽 S”。
返回最长字符串 X,要求满足 X 能除尽 str1 且 X 能除尽 str2。
示例 1:
输入:str1 = "ABCABC", str2 = "ABC"
输出:"ABC"
输出:"ABC"
示例 2:
输入:str1 = "ABABAB", str2 = "ABAB"
输出:"AB"
输出:"AB"
示例 3:
输入:str1 = "LEET", str2 = "CODE"
输出:""
输出:""
提示:
1 <= str1.length <= 1000
1 <= str2.length <= 1000
str1[i] 和 str2[i] 为大写英文字母
解题思路
用时100%,内存100%,没看题解,写了一个半小时,本以为是一道简单题,没想到坑还挺多。
首先说思路:我分两了三种情况,分别是长度相等,len1>len2,len2>len1
先求最大公约数,用maxSubString来记录最长字符串
1.如果相等,就用strcmp比较,如果strcmp == 0,就说明两个字符串完全相同,标志一下flag = 3
2.如果len1 > len2,从以len2为标准进行遍历,如有不同,跳出,这时的i是小于len2的,然后再判断长字符串的下一个字符是否是短字符串的第一个字符,主要防止ABCDEF ABC这种情况,如果是这种情况,用flag = 1标记一下
3.如果len2 < len1同理
最后根据标志flag的情况以及i是否等于短字符串的长度返回相应的字符串
注意:maxSubString要用指针定义,然后申请内存空间,不能直接用maxSubString[1000],因为如果用数组定义,它是一个局部变量,则它再函数结束后会接着释放掉,则主程序接收到的就是NULL,所以需要用指针,虽然指针maxSubString也是局部变量在函数结束后也会消失,但是它可以将地址返回到主程序,主程序就可以通过该地址找到字符串。
用时100%,内存100%,没看题解,写了一个半小时,本以为是一道简单题,没想到坑还挺多。
首先说思路:我分两了三种情况,分别是长度相等,len1>len2,len2>len1
先求最大公约数,用maxSubString来记录最长字符串
1.如果相等,就用strcmp比较,如果strcmp == 0,就说明两个字符串完全相同,标志一下flag = 3
2.如果len1 > len2,从以len2为标准进行遍历,如有不同,跳出,这时的i是小于len2的,然后再判断长字符串的下一个字符是否是短字符串的第一个字符,主要防止ABCDEF ABC这种情况,如果是这种情况,用flag = 1标记一下
3.如果len2 < len1同理
最后根据标志flag的情况以及i是否等于短字符串的长度返回相应的字符串
注意:maxSubString要用指针定义,然后申请内存空间,不能直接用maxSubString[1000],因为如果用数组定义,它是一个局部变量,则它再函数结束后会接着释放掉,则主程序接收到的就是NULL,所以需要用指针,虽然指针maxSubString也是局部变量在函数结束后也会消失,但是它可以将地址返回到主程序,主程序就可以通过该地址找到字符串。
1 char* gcdOfStrings(char* str1, char* str2) 2 int i = 0; 3 int len1 = strlen(str1); 4 int len2 = strlen(str2); 5 int lenFir = len1; 6 int lenSec = len2; 7 char *maxSubString; 8 int gcd, flag = 0; 9 int j; 10 11 maxSubString = (char *)malloc(sizeof(char) * 1000); 12 memset(maxSubString, 0, 1000); 13 gcd = len1 % len2; 14 while (gcd != 0) 15 { 16 len1 = len2; 17 len2 = gcd; 18 gcd = len1 % len2; 19 } 20 if (lenFir > lenSec) 21 { 22 for (i = 0; i < strlen(str2); i++) 23 { 24 if (str2[i] != str1[i]) 25 break; 26 } 27 28 if (str1[i] != str2[0]) //比较长字符串的下一个字符是否等于短字符串的第一个字符 29 { 30 flag = 1; 31 } 32 } 33 else if(lenFir < lenSec) 34 { 35 for (i = 0; i < strlen(str1); i++) 36 { 37 if (str1[i] != str2[i]) 38 break; 39 } 40 41 if (str1[0] != str2[i]) 42 { 43 flag = 2; 44 } 45 } 46 else if(lenFir = lenSec) 47 { 48 if (strcmp(str1, str2) == 0) 49 { 50 flag = 3; 51 } 52 } 53 54 for (j = 0; j < len2; j++) //最长字符串 len2是最大公约数 55 { 56 maxSubString[j] = str2[j]; 57 } 58 59 if (i==strlen(str2) && flag==0 || i==strlen(str1) && flag==0) 60 { 61 return maxSubString; 62 } 63 else if (flag == 3) 64 { 65 return str2; 66 } 67 else 68 { 69 return ""; 70 } 71 72 }