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

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



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'的结束符。这种方法可能更加简单一些,具体的实现我在这里就不多写了,感兴趣的朋友们可以尝试一下。




  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值