黑马程序员技术交流社区

标题: C语言中的字符串小问题 [打印本页]

作者: 啊康    时间: 2014-4-9 10:18
标题: C语言中的字符串小问题
各位大神,对于字符串我认为自学的还可以,但是遇到寻找两个字符串的最小或者最大子串我就晕了!求大神指点!例如adfghsdfgdfa和hsdfgertad这两个字符串中的最大子串该如何查找?我想的是将两个字符串分别遍历,利用双for循环来比较,但是中间比较的思路总是理不清感觉很乱!请各位大神指点迷津!谢谢!!

作者: FlyTrem    时间: 2014-4-9 10:47
先定义一个最长公共字符串字符个数为MAX=0.
然后开始遍历两个字符串的字符,判断是否相同,相同公共字符数 i 加一,并跳过本次循环。
如果不同则判断MAX和i,如果MAX小于i,则令MAX等于i,且记录公共字符串的开始与结束位置,并清零i值。
然后输出公共字符串就好了!
作者: 董月峰    时间: 2014-4-9 10:59
本帖最后由 董月峰 于 2014-4-9 11:42 编辑

这是我的基础测试最后一题。我给下我写的求2个最大公共字符串的函数吧

//比较2个字符串最大公共子串(串1,串2,串1长,串2长)
void maxstr(char *s1,char *s2,int num1,int num2)
{
    //index表示字符相同时s1初始角标,n2表示公共子串初始长度是0,n1表示每个公共子串的长度
        int index=0,n2=0,n1;
    //遍历s1
        for(int i = 0; i <= num1; i++)
        {
        //遍历s2
                for(int j = 0; j <= num2; j++)
                {
            //若遇到相同字符
                        if(s1==s2[j])
                        {
                //先赋值子串长度是1
                                n1 = 1;
                //看从相同字符向后有多少字符还相同
                                for(int k = 1; s1[i+k]==s2[j+k]; k++)
                //每多一个相同字符,n1自增1
                {
                    n1++;
                }
                //取n2为最长的n1
                                if(n1 > n2)
                                {
                    //记录最长n2时候,s【i】的角标位置index
                                        index = i;
                                        n2 = n1;
                                }
                //再与s1比较,从s2【n1+j】即可
                                j += n1;
                        }
                }
        }
    //当存在子串时候,输出最大的
    if(n2 !=0)
    {
        printf("最长的公共子串:");
        for(int i = 0; i < n2; i++)
            printf("%c",s1[index+i]);
    }
    //不存在子串输出没有
    else
        printf("没有公共子串!\n");
}



-----------分割线----------------
1.字符串长用strlen函数可求
2.求n个字符串串长可以根据以上函数用 递归 做





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