(Good topic)字符串的最大公因子 (3.21leetcode每日打卡)

 
对于字符串 S 和 T,只有在 S = T + ... + T(T 与自身连接 1 次或多次)时,我们才认定 “T 能除尽 S”。
返回最长字符串 X,要求满足 X 能除尽 str1 且 X 能除尽 str2。
 
示例 1:
输入:str1 = "ABCABC", str2 = "ABC"
输出:"ABC"

示例 2:
输入:str1 = "ABABAB", str2 = "ABAB"
输出:"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也是局部变量在函数结束后也会消失,但是它可以将地址返回到主程序,主程序就可以通过该地址找到字符串。
 
 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 }
 
 
 
原文地址:https://www.cnblogs.com/ZhengLijie/p/12544172.html