zoukankan      html  css  js  c++  java
  • OpenJudge计算概论-字符串最大跨距

    /*======================================================================
    字符串最大跨距
    总时间限制: 1000ms 内存限制: 65536kB
    描述
    有三个字符串S,S1,S2,其中,S长度不超过300,S1和S2的长度不超过10,想检测S1和S2是否同时在S中出现,且S1位于S2的左边,并在 S中互不交叉(即,S1的右边界点在S2的左边界点的左侧)。计算满足上述条件的最大跨距(即,最大间隔距离:最右边的S2的起始点与最左边的S1的终止 点之间的字符数目)。如果没有满足条件的偶对S1,S2存在,则输出 -1
    例如,S = "abcd123ab888efghij45ef67kl", S1="ab", S2="ef",其中,S1在S中出现了2次,S2也在S中出现了2次,最大跨距则为:18
    输入
    三个串:S1, S2, S3,其间以逗号间隔(注意,S1, S2, S3中均不含逗号);
    输出
    S1和S2在S最大跨距;若在S中没有满足条件的S1和S2,则输出-1
    样例输入
    abcd123ab888efghij45ef67kl,ab,ef
    样例输出
    18

    思路:
    大概就是查找s1和s2在s当中的位置,然后即可知道答案。
    细节:找到s1末尾字符的下标left,s2开头字符的下标right,答案就是right-left-1.
    字符串查找可以用string里面的strstr函数。
    #include <string.h>
      char *strstr( const char *str1, const char *str2 );
    
    

    功能:函数返回一个指针,它指向字符串str2 首次出现于字符串str1中的位置,如果没有找到,返回NULL。

    ========================================================================*/
     1 #include<stdio.h>
     2 #include<string.h>
     3 void strSwap(char a[],int len);//翻转字符串数组
     4 int main()
     5 {
     6     char s[330],s1[12],s2[12];
     7     int i,j,flag;
     8     int lenS,lenS1,lenS2;
     9     int left,right,res=-1;
    10     char *L,*R;
    11 
    12 
    13     freopen("5.in","r",stdin);
    14     scanf("%s",s);
    15     flag=0;
    16     for(i=0,j=0;s[i]!='';i++)
    17     {
    18         if(s[i]==',')
    19         {
    20             if(flag==0)
    21             {
    22                 flag=1;
    23                 s[i]='';
    24             }
    25             else if(flag==1)
    26             {
    27                 flag=2;
    28                 s1[j]='';
    29                 j=0;
    30             }
    31         }
    32         else if(flag==1)
    33         {
    34             s1[j]=s[i];
    35             j++;
    36         }
    37         else if(flag==2)
    38         {
    39             s2[j]=s[i];
    40             j++;
    41         }
    42     }
    43     s2[j]='';
    44 
    45     lenS=strlen(s);
    46     lenS1=strlen(s1);
    47     lenS2=strlen(s2);
    48     //printf("%d %s
    %d %s
    %d %s
    ",lenS,s,lenS1,s1,lenS2,s2);
    49 
    50     L=strstr(s,s1);
    51     left=L-s+lenS1-1;//s1字符串最末一个字符在S当中的下标
    52     /*printf("%d
    ",left);*/
    53     strSwap(s,lenS);
    54     strSwap(s2,lenS2);
    55     R=strstr(s,s2);
    56     right=R-s+lenS2-1;//S和S2字符串翻转情况下,s2的最末一个字符在S当中的下标
    57     right=lenS-right-1;//S和S2字符串正常情况下,s2的最初一个字符在S当中的下标。等同于:S和S2字符串翻转情况下,S除去S2后剩余的字符个数。
    58     if(left>right)
    59         printf("-1
    ");
    60     else    printf("%d
    ",right-1-left);//right-1-left是s1和s2之间的字符个数
    61     return 0;
    62 }
    63 void strSwap(char a[],int len)//翻转字符串数组
    64 {
    65     int i,j=len-1;
    66     char t;
    67     len=len/2;
    68     for(i=0;i<len;i++,j--)
    69     {
    70         t=a[i];
    71         a[i]=a[j];
    72         a[j]=t;
    73     }
    74 }

     另一个输入比较简洁的代码:

     1 #include<stdio.h>
     2 #include<string.h>
     3 void fanZhuan(char a[])
     4 {
     5     int i,j,len;
     6     char t;
     7     len=strlen(a);
     8     for(i=0,j=len-1;i<j;i++,j--)
     9     {
    10         t=a[i];a[i]=a[j];a[j]=t;
    11     }
    12 }
    13 int main()
    14 {
    15     freopen("data.in","r",stdin);
    16     char s[350],s1[15],s2[15];
    17     int i,j,k,lenS,lenS1,lenS2;
    18     char *p;
    19     int index1,index2;
    20     gets(s);
    21     for(i=0;s[i]!='';i++)
    22     {
    23         if(s[i]==',')
    24         {
    25             s[i]='';
    26             lenS=i;
    27             k=i+1;
    28             break;
    29         }
    30     }
    31     for(i=k,j=0;s[i]!='';i++)
    32     {
    33         if(s[i]!=',') {s1[j]=s[i];j++;}
    34         else 
    35         {
    36             k=i+1;
    37             s1[j]='';
    38             lenS1=strlen(s1);
    39             break;
    40         }
    41     }
    42     for(i=k,j=0;s[i]!='';i++)
    43     {
    44         s2[j]=s[i];j++;
    45     }
    46     s2[j]='';
    47     lenS2=strlen(s2);
    48     //printf("%s %s %s
    ",s,s1,s2);
    49     
    50     p=strstr(s,s1);
    51     if(p!=NULL) { index1=p-s+lenS1-1; }
    52     else 
    53     {
    54         printf("-1
    ");
    55         return 0;
    56     }
    57     
    58     fanZhuan(s);
    59     fanZhuan(s2);
    60     p=strstr(s,s2);
    61     if(p==NULL) { printf("-1
    ");  return 0; }
    62     else
    63     {
    64         index2=p-s+lenS2-1;
    65         index2=lenS-index2-1;
    66         //printf("%d %d
    ",index1,index2);
    67         if(index1>=index2){ printf("-1
    ");  return 0; }
    68         else 
    69             printf("%d
    ",index2-index1-1);
    70     }
    71     return 0;
    72 }
    View Code
  • 相关阅读:
    DataGrid 的鼠标点击
    Menu菜单
    密码问题
    Combobox代码
    EndpointContracts
    the Differences between abstract class & interface in C#接口和抽象类的区别
    How to get MetaData on client side in WCF?如何在客户端获取WCF service的元数据
    Endpoint
    Assembly Essence 程序集深入探讨:程序集结构及部署
    EndpointBinding
  • 原文地址:https://www.cnblogs.com/huashanqingzhu/p/3501469.html
Copyright © 2011-2022 走看看