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