zoukankan      html  css  js  c++  java
  • 找出字符串中最长的子串

    #include<stdio.h>
    #include<string.h>
    void fun1(char *a);
    int main(void)
    {
    	char str[100];
    	puts("请输入一段长字符串,本程序将找出其中最长的子串");
    	while(gets(str)!=NULL && str[0] != '')
    	{
    		fun1(str);
    		puts("
    再输入一个字符串(空行退出):");
    	}
    	puts("Bye!@~");
    
    	return 0;
    }
    void fun1(char *p)
    {
    	unsigned int i;
    	unsigned int len_word;
    	unsigned int len_max=0;
    	unsigned int place=0; //记录指针位置
    	//for(i = 0;p[i]!='';i++)  //错误!!!
    	for(i = 0;i<strlen(p);i++)   //空格也计入i了
    	{
    		len_word=0;  //单词长度每次清零
    		while(p[i]!=' ' && p[i]!='')  
    		{
    			i++;
    			len_word++;
    		}
    		if(len_max<len_word)
    		{
    			len_max=len_word;
    			place = i-len_word;
    		}
    	}
    	puts("最长的子串为:");
    	for(i=place;i<place+len_max;i++)  //注意这里的范围
    		printf("%c",p[i]);
    }
    

     

    程序思想:

    记录每个单词的长度,与max_len比较,比它长,则将值赋给max_len。

    i记录读入的字符个数(包含空格),i-max_len得到的就是这个最长单词的首字母的位置。


    此程序有几点值得注意的:

    ①内循环while(p[i]!=' ' && p[i]!='')   为什么要两个限制条件呢?

    答:p[i]!=‘ ’这个条件很显然,因为是以空格区分两个子串

    p[i]!=''这个条件是因为,最后一个子串不是以空格结尾的,而是结束符。


    ②外循环for(i = 0;i<strlen(p);i++) ,为什么这里不写for(i = 0;str[i]!='';i++)呢?

    答:内循环判断最后一个子串的时候,i一直要自加到i=len,即p[len]='' 的时候,才退出内循环。

    然后进入外循环,此时要先执行i++,再执行判断条件。也就是说,str[i]此时的值是str[len+1],而这个值我们无法确定,它可能是内存中的任何值。

    如果这里的判断条件是str[i]!='',那么程序还会再次执行内循环,产生错误!


  • 相关阅读:
    P3970 [TJOI2014]上升子序列
    受欢迎的牛(Tarjan缩点模板)
    Y15BeTa的乱搞方法(占坑待填)
    Luogu P4145 上帝造题的七分钟2 / 花神游历各国
    Luogu P1525 【关押罪犯】
    Luogu P1077 摆花 NOIP2012pjT3
    Nowcoder deco的abs
    CSP-S前的芝士清单
    普天同庆
    线段树区改区查标记永久化板子
  • 原文地址:https://www.cnblogs.com/james1207/p/3281221.html
Copyright © 2011-2022 走看看