zoukankan      html  css  js  c++  java
  • 北大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("
    ");
    	}
    	return 0;
    }

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




  • 相关阅读:
    UVa 12174 (滑动窗口) Shuffle
    UVa 1607 (二分) Gates
    CodeForces ZeptoLab Code Rush 2015
    HDU 1525 (博弈) Euclid's Game
    HDU 2147 (博弈) kiki's game
    UVa 11093 Just Finish it up
    UVa 10954 (Huffman 优先队列) Add All
    CodeForces Round #298 Div.2
    UVa 12627 (递归 计数 找规律) Erratic Expansion
    UVa 714 (二分) Copying Books
  • 原文地址:https://www.cnblogs.com/fengju/p/6336172.html
Copyright © 2011-2022 走看看