黑马程序员技术交流社区

标题: 截取最大公共字符串 [打印本页]

作者: EchoWill    时间: 2014-4-28 11:02
标题: 截取最大公共字符串
本帖最后由 EchoWill 于 2014-4-28 19:19 编辑
  1. #include <stdio.h>
  2. #include <string.h>

  3. void maxStr(char *s1 ,char *s2,int num1,int num2);

  4. int main(int argc, const char * argv[])
  5. {
  6.    
  7.    
  8.     // 定义2个字符串
  9.     char str1[1024],str2[1024];

  10.     while (1) {
  11.         
  12.         printf("请输入第一个子串:\n");
  13.         gets(str1);
  14.         int len1 = strlen(str1); // 获取字符串str1的长度
  15.         
  16.         printf("请输入第二个子串:\n");
  17.         gets(str2);
  18.         int len2 = strlen(str2); // 获取字符串str2的长度
  19.         
  20.         maxStr(str1, str2, len1, len2);
  21.         
  22.         getchar();
  23.     }
  24.      
  25.    
  26.     return 0;
  27. }

  28. // 获取最大公共字符串,字符串s1长度num1,字符串s2长度num2
  29. void maxStr(char *s1 ,char *s2,int num1,int num2)
  30. {
  31.     int index = 0;  // 字符相同时,字符串s1的初始下标
  32.     int n1; // 每个公共子串的长度
  33.     int n2 = 0; // 公共子串的初始长度
  34.    
  35.     // 循环遍历2个字符串
  36.     for (int i = 0; i<num1; i++)
  37.     {
  38.         for (int j = 0; j< num2; j++)
  39.         {
  40.             if (s1[i] == s2[j] && s1[i]!='\0')  // 当字符相同时,给定子串长度为1
  41.             {
  42.                 n1 = 1;
  43.                
  44.                 // 循环判断相同字符数
  45.                 for (int k = 1; s1[i+k]==s2[j+k] && s1[i+k]!='\0'; k++)
  46.                 {
  47.                     n1++;
  48.                 }
  49.                
  50.                 // 找到最长子串时,设置下标index
  51.                 if (n1>n2)
  52.                 {
  53.                     index = i;
  54.                     n2 = n1 ;
  55.                 }
  56.                 j+=n1-1;
  57.             }
  58.         }
  59.     }
  60.    
  61.     if (n2!=0)
  62.     {
  63.         printf("最大公共子串:\n");
  64.         for (int i = 0; i<n2; i++) {
  65.             printf("%c",s1[index+i]);
  66.         }
  67.     }
  68.     else
  69.     {
  70.         printf("没有公共子串!\n");
  71.     }
  72. }
复制代码

功能没实现,大家有解决方案吗?
作者: 胡铭    时间: 2014-4-28 11:33
本帖最后由 胡铭 于 2014-4-28 14:44 编辑

#include <stdio.h>
#include <string.h>

void maxStr(char *s1 ,char *s2,int num1,int num2);

int main(int argc, const char * argv[])
{
   
   
    // 定义2个字符串
    char str1[1024],str2[1024];

    while (1) {
        
        printf("请输入第一个子串:\n");
        gets(str1);
        int len1 = strlen(str1); // 获取字符串str1的长度
        
        printf("请输入第二个子串:\n");
        gets(str2);
        int len2 = strlen(str2); // 获取字符串str2的长度
        
        maxStr(str1, str2, len1, len2);
        
        getchar();
    }
     
   
    return 0;
}

// 获取最大公共字符串,字符串s1长度num1,字符串s2长度num2
void maxStr(char *s1 ,char *s2,int num1,int num2)
{
    int index = 0;  // 字符相同时,字符串s1的初始下标
    int n1; // 每个公共子串的长度
    int n2 = 0; // 公共子串的初始长度
   
    // 循环遍历2个字符串
    for (int i = 0; i<num1; i++)
    {
        for (int j = 0; j< num2; j++)
        {
            if (s1 == s2[j] && s1!='\0')  // 当字符相同时,给定子串长度为1
            {
                n1 = 1;
               
                // 循环判断相同字符数
                for (int k = 1; s1[i+k]==s2[j+k] && s1[i+k]!='\0'; k++)
                {
                    n1++;
                }
               
                // 找到最长子串时,设置下标index
                if (n1>n2)
                {
                    index = i;
                    n2 = n1 ;
                }
                j+=n1-1;
            }
        }
    }
   
    if (n2!=0)
    {
        printf("最大公共子串:\n");
        for (int i = 0; i<n2; i++) {
            printf("%c",s1[index+i]);                //1改成i就好了
        }
    }
    else
    {
        printf("没有公共子串!\n");
    }
}
作者: 兰闻天    时间: 2014-4-28 12:18
貌似基础考试的题都一样




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2