北大OJ百练——3179:最长单词(C语言)

废话不多说,先来上题目:

北大OJ百练——3179:最长单词(C语言)_第1张图片


OJ的这题关键在于如何计算我所选择的开始位置和结束位置。我用的方法是有4个参数来存储起来,start, buffStart, lenth, maxLenth.

start: 记录总个字符串中最长的那个单词的开始的位置;

buffStart: 记录当前位置的单词的开始位置;

lenth: 记录当前位置的单词长度;

maxLenth: 记录这个字符中最长的单词的长度。

如果我们在循环的过程中遇到是字母,(如果此时的lenth的值为0,那么buffStart的值也会被修正为i在循环中的位置)那么我的lenth就是自增,并且判断些刻的lenth是否大于maxLenth,如果大,那么就把lenth的值给maxLenth,start的值修正为buffStart的值;如果我们在循环的过程遇到的不是字母,那么lenth就清零。

如下是我的代码:

#include <stdio.h>
#include <string.h>
#define LONGESTWORDS 200
#define IS_LETTER 1
#define NOT_LETTER 0

int isLetter(char ch)
{
	if(('a' <= ch)&&(ch <= 'z') || ('A' <= ch)&&(ch <= 'Z'))
		return IS_LETTER;
	else return NOT_LETTER;
}

int main()
{
	char words[LONGESTWORDS];
	int start, buffStart, lenth, maxLenth;
	int i;
	while(gets(words))
	{
		start = 0;
		buffStart = 0;
		lenth = 0;
		maxLenth = 0;
		for (i = 0; i < strlen(words); ++i)
		{
			if(isLetter(words[i]))
			{
				if(!lenth)
				{
					buffStart = i;
				}
				++lenth;
				if(lenth >= maxLenth)
				{
					maxLenth = lenth;
					start = buffStart;
				}
			}
			else
			{
				lenth = 0;
			}
		}
		for(i = start; i < start + maxLenth; ++i)
		{
			printf("%c", words[i]);
		}
		printf("\n");
	}
	return 0;
}

当然,如果你不想去繁琐的用4个参数,也可以只用一个字符数组来解决问题,只要我们遇到的这个字母是单词的第一个字母,那么我们从这个字符数组的第一个位置开始赋值,直到遇到不是字母的为止,并在每次都在最后赋上一个'\0'的结束符。这种方法可能更加简单一些,具体的实现我在这里就不多写了,感兴趣的朋友们可以尝试一下。




你可能感兴趣的:(算法,ACM,程序设计,OJ,最长单词)