zoukankan      html  css  js  c++  java
  • (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 }
     
     
     
  • 相关阅读:
    [论文泛读]Web服务综述相关论文1(1篇)
    [论文泛读]QoS of Web service 综述相关论文1(1篇)
    用jquery判断一个对象是否存在
    android 程序开发 R.### cannot be resolved
    发票管理及打印系统的部分代码
    项目下R.java竟然没有R.id这个类!
    C#调用ISAG网关下发彩信长征路上的一个小脚印
    机打发票打印管理
    Android获取手机和系统版本等信息的代码
    Android开发环境搭建全程演示(jdk+eclipse+android sdk)
  • 原文地址:https://www.cnblogs.com/ZhengLijie/p/12544172.html
Copyright © 2011-2022 走看看