求助这个程序。。。关于小于和小于等于的问题
#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。。。。。。。
----------------解决方案--------------------------------------------------------
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 ...
str(strlen(str))就是最后的那个\0,无所谓的。因为它必须要统计到一个单词的结尾才能判定,所以需要判到结尾的\0。否则你就需要让字符串多一个非英文字母的分隔字符。比如你输入“i am a student ",这样也可以得出studen ...
明白了。。。。。。感谢。。。。
----------------解决方案--------------------------------------------------------