当前位置:编程学习 > C/C++ >>

NYOJ163 Phone list

题目分析:
这道题也就是给定电话号码,然后看较短的号码是不是较长的号码的前缀,如果是的话就输出NO,否则就输出YES。首先,作为一个二逼青年,我第一时间想到的肯定是把所有的电话号码排序,这样只可能前一个字符串是后一个字符串的前缀了。当然还可以进行减枝,如果两个字符串的第一个字符不等,或者前一个字符串的长度比后一个字符串的长度长。如果是前缀的话,长度肯定是小于等于撒~
先给出二逼的解法,稍后给出文艺点的解法。OK,文艺青年来袭~~

[cpp]
#include<stdio.h>  
#include<stdlib.h>  
#include<string.h>  
 
int compare(const void *a, const void *b) 

    return strcmp((char *)a, (char *)b); 

 
const int Len = 13;//电话号码最多就11位吧,加一个'\0';  
char phone[100000][Len]; 
 
int main() 

    int t,i,n; 
    int nLen1,nLen2; 
    char *p1; 
    char *p2; 
    bool flag; 
    scanf("%d", &t); 
    while(t--) 
    { 
        scanf("%d", &n); 
        for(i = 0; i < n; ++i) 
            scanf("%s", phone[i]); 
        flag = false; 
        qsort(phone, n, Len, compare); 
        for(i = 0; i < n - 1; ++i) 
        { 
            if(phone[i][0] != phone[i + 1][0])//第一位就不等  
                continue; 
            nLen1 = strlen(phone[i]); 
            nLen2 = strlen(phone[i + 1]); 
            if(nLen1 <= nLen2)//前一个的长度小于后一个  
            { 
                p1 = phone[i]; 
                p2 = phone[i + 1]; 
                while(*(++p1) == *(++p2)) ;//这个空循环看懂了么?  
                if(*p1 == '\0') 
                { 
                    flag = true; 
                    break; 
                } 
            }            
        }//end for  
        if(flag) 
            printf("NO\n"); 
        else 
            printf("YES\n"); 
    } 
    return 0; 

补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,