找出满足规则aAAAxAAAa的字符

/* 
 * File:   aAAAxAAAa.h
 * Author: sculley
 *
 * Created on December 27, 2012, 10:18 AM
 *
 * 请找出输入文件 (input.txt) 中所有符合下面条件的字符 
 * 1. 是一个小写字母, 并且, 
 * 2. 两侧各有且只有三个大写字母. 
 * 例如: aAAAxAAAa 中的 x  
 * 要求及说明: 
 * 1. 不能使用正则表达式; 
 * 2. 请尽量优化代码结构和算法性能; 
 * 3. 能适应更大规模的数据源(input.txt); 
 * 提示: 
 * 1. 输出的结果是有语义的字符串. 
 * 
 * URL: http://www.oschina.net/code/snippet_192190_16605
 */

#include <ctype.h>
#include <stdio.h>
#include <string.h>

/*
 * 匹配函数,逐个字符比对
 * 匹配时返回值为10,11,
 * 不匹配时返回值为1~9,表示不匹配的字符位置
 *
 * array_point       主串的匹配位置
 * j                 子串的匹配位置
 * add_on            默认为0,表示aAAAxAAAa_test的上一次返回值为1~9;如果返回值为10,11时add_on传入的值为1
 * array_start       文本映射到内存后在内存中的起始位置
 * array_length      文本长度 byte
 */
int aAAAxAAAa_test(char *array_point, int j, int add_on, char *array_start, long array_length)
{
	switch(j)
	{
		case 0:
			if(islower(*(array_point)))
				;
			else
				return 1;
		case 1:
			if(isupper(*(array_point+1)))
				;
			else
				return 2;
		case 2:
			if(isupper(*(array_point+2)))
				;
			else
				return 3;
		case 3:
			if(isupper(*(array_point+3)))
				;
			else
				return 4;
		case 4:
			if(islower(*(array_point+4)))
			{
				if(add_on == 1)
				{
					//考虑aAAAxAAAaAAA的情况,x确认匹配后则第二个a很可能也符合规则,此时,add_on=1,j=1只匹配三个字符即确认匹配
					return 11;
				}
            }
			else
				return 5;
		case 5:
			if(isupper(*(array_point+5)))
				;
			else
				return 6;
		case 6:
			if(isupper(*(array_point+6)))
				;
			else
				return 7;
		case 7:
			if(isupper(*(array_point+7)))
				;
			else
				return 8;
		case 8:
			//行尾和文件结尾的处理
			if(islower(*(array_point+8)) || (*(array_point+8) == '\r' && *(array_point+9) == '\n') || array_point+8 == array_start+array_length)
				;
			else
				return 9;
	}
	return 10;	
}

/*
 * 匹配结果的处理
 *
 * array_test        文本映射到内存后在内存中的起始位置
 * test_file_length  文本长度 byte
 * yes               匹配字符的存储内存指针
 */
int aAAAxAAAa_result(char *array_test, long test_file_length, char *yes)
{
    char *array_test_start;
    array_test_start = array_test;
    char *yes_start;
    yes_start = yes;
    int j = 0;
    int add_on = 0;
    
	/*
	 * 开始8个字符就满足规则的情况
	 */
    if(isupper(*array_test) && isupper(*(array_test+1)) &&	isupper(*(array_test+2)) && islower(*(array_test+3)) && \
            isupper(*(array_test+4)) && isupper(*(array_test+5)) && isupper(*(array_test+6)) && islower(*(array_test+7)))
    {
        *yes = *(array_test+3);
        yes = yes+1;
        array_test = array_test+8;
        j = 1;
    }
    
	/*
	 * 一般情况
	 */
    for(; array_test < array_test_start+test_file_length;)
    {
        int test_result = aAAAxAAAa_test(array_test, j, add_on, array_test_start, test_file_length);
        switch(test_result)
        {
            case 1:
                array_test = array_test+1;
                j = 0;
                add_on = 0;
                continue;
            case 2:
                array_test = array_test+1;
                j = 1;
                add_on = 0;
                continue;
            case 3:
                array_test = array_test+1;
                j = 1;
                add_on = 0;
                continue;
            case 4:
                array_test = array_test+1;
                j = 1;
                add_on = 0;
                continue;
            case 5:
                array_test = array_test+1;
                j = 0;
                add_on = 0;
                continue;
            case 6:
                array_test = array_test+1;
                j = 1;
                add_on = 0;
                continue;
            case 7:
                array_test = array_test+1;
                j = 1;
                add_on = 0;
                continue;
            case 8:
                array_test = array_test+1;
                j = 1;
                add_on = 0;
                continue;
            case 9:
                array_test = array_test+1;
                j = 0;
                add_on = 0;
                continue;
            case 10:
                *yes = *(array_test+4);
                yes = yes+1;
                array_test = array_test+9;
                j = 1;
                add_on = 1;
                continue;
            case 11:
                *yes = *(array_test-1);
                yes = yes+1;
                array_test = array_test+4;
                j = 1;
                add_on = 1;
                continue;
        }
    }
}

http://www.oschina.net/code/snippet_192190_16605?p=3#comments solu的另一种解法,将所有的大写字符替换为1,然后将两边都是3的字符取出即是答案。另外脚本语言写短的代码的确省事儿多了,容易抽象!
posted @ 2012-12-27 16:39  sculley  阅读(410)  评论(0)    收藏  举报