对于字符串 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 }
 
 
 

(Good topic)字符串的最大公因子 (3.21leetcode每日打卡)的更多相关文章

  1. LeetCode 1071. 字符串的最大公因子(Greatest Common Divisor of Strings) 45

    1071. 字符串的最大公因子 1071. Greatest Common Divisor of Strings 题目描述 对于字符串 S 和 T,只有在 S = T + ... + T(T 与自身连 ...

  2. [每日一题系列] LeetCode 1071. 字符串的最大公因子

    题目 对于字符串 S 和 T,只有在 S = T + ... + T(T 与自身连接 1 次或多次)时,我们才认定 "T 能除尽 S". 返回最长字符串 X,要求满足 X 能除尽 ...

  3. [LeetCode]1071. 字符串的最大公因子(gcd)

    题目 对于字符串 S 和 T,只有在 S = T + ... + T(T 与自身连接 1 次或多次)时,我们才认定 "T 能除尽 S". 返回最长字符串 X,要求满足 X 能除尽 ...

  4. [Swift]LeetCode1071.字符串的最大公因子 | Greatest Common Divisor of Strings

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  5. P1664 每日打卡心情好

    题目背景 在洛谷中,打卡不只是一个简单的鼠标点击动作,通过每天在洛谷打卡,可以清晰地记录下自己在洛谷学习的足迹.通过每天打卡,来不断地暗示自己:我又在洛谷学习了一天,进而帮助自己培养恒心.耐心.细心. ...

  6. (leetcode每日打卡)秋叶收藏集【动态规划】

    LCP 19.秋叶收藏集 题目链接 算法 动态规划 时间复杂度O(n) 1.题目要求最终形成[红.黄.红]三部分,每部分数量可以不相等,问最终调整操作数量最小是多少.这道题一开始考虑暴力去做,枚举两个 ...

  7. 【LeetCode】2020-03 每日一题

    121. 买卖股票的最佳时机(简单) [分类]:模拟.思维 [题解]:可以用O(n)的复杂度完成,只需要在遍历的时候记录到当前位置为止买入股票的最小价格minn,再维护一个当前卖出股票价(a-minn ...

  8. Discuz! X3 数据表、数据字段说明

    pre_common_admincp_cmenu 后台菜单收藏表 字段名 数据类型 默认值 允许非空 自动递增 备注 id smallint(6) unsigned    NO 是   title v ...

  9. Discuz! X3 数据字典

    pre_common_admincp_cmenu 后台菜单收藏表 字段名 数据类型 默认值 允许非空 自动递增 备注 id smallint(6) unsigned    NO 是   title v ...

  10. MQTT 3.1协议非严肃反思录

    前言 MQTT 3.1协议在弱网络环境下(比如2G/3G等)表现不够好,因此才有了反思. 弱网环境下表现 手机等终端在弱网络环境下丢包情况会非常明显,连接MQTT Server成功率很低.相比单纯的请 ...

随机推荐

  1. ubuntu下安装mysqlclient报错

    输入以下代码: 1 解决方法: 2 sudo apt-get install libmysqlclient-dev 3 4 再次安装: 5 pip3 install mysqlclient 文章链接: ...

  2. Win11 开启 telnet

    'telnet' 不是内部或外部命令,也不是可运行的程序或批处理文件. 首先我们打开底部"开始菜单",如图所示.接着打开其中的"设置". 然后进入左边的&quo ...

  3. C#.NET 国密SM2 加密解密 与JAVA互通 ver:20230805

    C#.NET 国密SM2 加密解密 与JAVA互通 ver:20230805 .NET 环境:.NET6 控制台程序(.net core). JAVA 环境:JAVA8,带maven 的JAVA控制台 ...

  4. nginx反向代理常用基本配置

    http反向代理 http { ...     server {     listen 80;         location / {         proxy_pass http://192.1 ...

  5. windows系统上的大文件拆分合并

    上周碰到一个并不算很大的问题,但是也有记录的价值. 从公司带出来的离线补丁包需要传到客户服务器上,但是被告知并不能在现场机器上插U盘,会触发告警.上传只能把U盘上的内容通过私人笔记本刻录到光盘上,插光 ...

  6. 其它——windows提示缺少VCRUNTIME140.dll错误

    文章目录 一 原因 二 解决方法一 三 解决方法二 缺少了Microsoft.Net.Framework的安装 一 原因 最新在系统安装一些软件发现提示 这是因为缺少了一下windows运行需要的库 ...

  7. 校招零Offer要不要先找实习?

    国庆前后被问到最多的问题是:"磊哥,我现在还是 0 Offer,要不要先去找个实习?",给大家看看部分截图. 同学 A: 同学 B: 同学 C: 其他还有一些截图,我这里就不一一贴 ...

  8. LVS+keepalived配置高可用架构和负载均衡机制(1)

    一.基础知识 1. 四层负载均衡(基于IP+端口的负载均衡) 所谓四层负载均衡,也就是主要通过报文中的目标ip地址和端口,再加上负载均衡设备设置的服务器选择方式(分发策略,轮询),决定最终选择的内部服 ...

  9. liunx知识点--umask

    介绍 umask(user's mask)用来设置文件权限掩码.权限掩码是由3个八进制的数字所组成,将现有的存取权限减掉权限掩码后,即可产生建立文件时预设的权限. UNIX最初实现时不包含umask命 ...

  10. 由mysql转为oracle注意事项

    1. text类型->nclob 2. 表名是关键字   引号 3. 字段名是关键字 引号 4. 日期型和mysql不同,hh24:mi:ss  就是HH:mm:ss,库里存日期型也可以(查询时 ...