当前位置: 代码迷 >> C语言 >> 求助这个程序。。。关于小于和小于等于的问题
  详细解决方案

求助这个程序。。。关于小于和小于等于的问题

热度:489   发布时间:2008-03-12 21:59:44.0
求助这个程序。。。关于小于和小于等于的问题
#include "stdio.h"
alp(char c)
{if((c>='a'&&c<='z')||(c>='A'&&c<='Z'))
    return(1);
    else
    return(0);
}

longest(char str[])
{int i,len=0,length=0,flag=1,point,place;
    for(i=0;i<=strlen(str);i++)
    {
        if(alp(str[i]))
        {if(flag)
            {point=i;
            flag=0;
            }
            else len++;}
        else
        {flag=1;
            if(len>=length)
            {length=len;
                place=point;
                len=0;}
            }
        }
        
        return(place);

}
    
main()
{char line[100];
    int j;
    printf("aaaa \n");
    gets(line);
    printf("aaaaaaa \n");
    for(j=longest(line);alp(line[j]);j++)
    printf("%c",line[j]);
    printf(" \n");
    }
这个程序可以运行。。。。就是输入一个字符串返回其中最长的那个单词。。。。。。。现在我想问的是这段
longest(char str[])
{int i,len=0,length=0,flag=1,point,place;
    for(i=0;i<=strlen(str);i++)
为什么是i<=strlen(str)而不是i<strlen(str)我改成i<strlen(str)输出结果就不正确了。。。。。比如输入i am a student。。。如果是<=能输出student。。。但是如果换成<就输出不正确的am。。。。。。。
搜索更多相关的解决方案: flag  len  str  alp  

----------------解决方案--------------------------------------------------------
str(strlen(str))就是最后的那个\0,无所谓的。因为它必须要统计到一个单词的结尾才能判定,所以需要判到结尾的\0。否则你就需要让字符串多一个非英文字母的分隔字符。比如你输入“i am a student ",这样也可以得出student的结果。
上面的算法就是那个经典的“最大子串和”问题。
直接写出来的算法的时间复杂度是O(n^3),可以保存一些统计结果,以改进为O(n^2),使用分治法可以达到O(n logn),最佳算法是基于动态规划的算法(即上面的代码),时间复杂度是O(n)。有关这个问题,可以参考算法书。在《编程珠玑》一书中有对这个问题的介绍。这个一维问题还可以推广到多维,将更复杂一些。

[[it] 本帖最后由 hoodlum1980 于 2008-3-13 09:17 编辑 [/it]]
----------------解决方案--------------------------------------------------------
[bo]以下是引用 [un]hoodlum1980[/un] 在 2008-3-13 01:36 的发言:[/bo]

str(strlen(str))就是最后的那个\0,无所谓的。因为它必须要统计到一个单词的结尾才能判定,所以需要判到结尾的\0。否则你就需要让字符串多一个非英文字母的分隔字符。比如你输入“i am a student ",这样也可以得出studen ...

明白了。。。。。。感谢。。。。
----------------解决方案--------------------------------------------------------
  相关解决方案