/*======================================================================
字符串最大跨距
总时间限制: 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。

========================================================================*/
 #include<stdio.h>
#include<string.h>
void strSwap(char a[],int len);//翻转字符串数组
int main()
{
char s[],s1[],s2[];
int i,j,flag;
int lenS,lenS1,lenS2;
int left,right,res=-;
char *L,*R; freopen("5.in","r",stdin);
scanf("%s",s);
flag=;
for(i=,j=;s[i]!='\0';i++)
{
if(s[i]==',')
{
if(flag==)
{
flag=;
s[i]='\0';
}
else if(flag==)
{
flag=;
s1[j]='\0';
j=;
}
}
else if(flag==)
{
s1[j]=s[i];
j++;
}
else if(flag==)
{
s2[j]=s[i];
j++;
}
}
s2[j]='\0'; lenS=strlen(s);
lenS1=strlen(s1);
lenS2=strlen(s2);
//printf("%d %s\n%d %s\n%d %s\n",lenS,s,lenS1,s1,lenS2,s2); L=strstr(s,s1);
left=L-s+lenS1-;//s1字符串最末一个字符在S当中的下标
/*printf("%d\n",left);*/
strSwap(s,lenS);
strSwap(s2,lenS2);
R=strstr(s,s2);
right=R-s+lenS2-;//S和S2字符串翻转情况下,s2的最末一个字符在S当中的下标
right=lenS-right-;//S和S2字符串正常情况下,s2的最初一个字符在S当中的下标。等同于:S和S2字符串翻转情况下,S除去S2后剩余的字符个数。
if(left>right)
printf("-1\n");
else printf("%d\n",right--left);//right-1-left是s1和s2之间的字符个数
return ;
}
void strSwap(char a[],int len)//翻转字符串数组
{
int i,j=len-;
char t;
len=len/;
for(i=;i<len;i++,j--)
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}

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

 #include<stdio.h>
#include<string.h>
void fanZhuan(char a[])
{
int i,j,len;
char t;
len=strlen(a);
for(i=,j=len-;i<j;i++,j--)
{
t=a[i];a[i]=a[j];a[j]=t;
}
}
int main()
{
freopen("data.in","r",stdin);
char s[],s1[],s2[];
int i,j,k,lenS,lenS1,lenS2;
char *p;
int index1,index2;
gets(s);
for(i=;s[i]!='\0';i++)
{
if(s[i]==',')
{
s[i]='\0';
lenS=i;
k=i+;
break;
}
}
for(i=k,j=;s[i]!='\0';i++)
{
if(s[i]!=',') {s1[j]=s[i];j++;}
else
{
k=i+;
s1[j]='\0';
lenS1=strlen(s1);
break;
}
}
for(i=k,j=;s[i]!='\0';i++)
{
s2[j]=s[i];j++;
}
s2[j]='\0';
lenS2=strlen(s2);
//printf("%s %s %s\n",s,s1,s2); p=strstr(s,s1);
if(p!=NULL) { index1=p-s+lenS1-; }
else
{
printf("-1\n");
return ;
} fanZhuan(s);
fanZhuan(s2);
p=strstr(s,s2);
if(p==NULL) { printf("-1\n"); return ; }
else
{
index2=p-s+lenS2-;
index2=lenS-index2-;
//printf("%d %d\n",index1,index2);
if(index1>=index2){ printf("-1\n"); return ; }
else
printf("%d\n",index2-index1-);
}
return ;
}

OpenJudge计算概论-字符串最大跨距的更多相关文章

  1. OpenJudge计算概论-字符串排序

    /*====================================================================== 字符串排序 总时间限制: 1000ms 内存限制: 6 ...

  2. OpenJudge计算概论-取石子游戏

    OpenJudge计算概论-取石子游戏[函数递归练习] /*====================================================================== ...

  3. Openjudge计算概论——数组逆序重放【递归练习】

    /*===================================== 数组逆序重放 总时间限制:1000ms 内存限制:65536kB 描述 将一个数组中的值按逆序重新存放. 例如,原来的顺 ...

  4. OpenJudge计算概论-计算书费

    /*============================================== 计算书费 总时间限制: 1000ms 内存限制: 65536kB 描述 下面是一个图书的单价表: 计算 ...

  5. OpenJudge计算概论-最高的分数

    /*======================================================== 最高的分数 总时间限制: 1000ms 内存限制: 65536kB 描述 孙老师 ...

  6. OpenJudge计算概论-求特殊自然数【枚举法】【将整数转成字符串】

    /*======================================================================== 求特殊自然数 总时间限制: 1000ms 内存限制 ...

  7. OpenJudge计算概论-忽略大小写比较字符串大小

    /*======================================================================= 忽略大小写比较字符串大小 总时间限制: 1000ms ...

  8. Openjudge计算概论-求序列中的众数

    /*===================================== 求序列中的众数 总时间限制: 1000ms 内存限制: 65536kB 描述 输入一个长度为N的整数序列 (不多于128 ...

  9. OpenJudge计算概论-比饭量【枚举法、信息数字化】

    /*====================================================================== 比饭量 总时间限制: 1000ms 内存限制: 655 ...

随机推荐

  1. BZOJ3028 食物 (生成函数)

    首先 1+x+x^2+x^3+...+x^∞=1/(1-x) 对于题目中的几种食物写出生成函数 (对于a*x^b , a表示方案数 x表示食物,b表示该种食物的个数) f(1)=1+x^2+x^4+. ...

  2. 推荐mysql优化的21条经验

    1. 为查询缓存优化你的查询 大多数的MySQL服务器都开启了查询缓存.这是提高性最有效的方法之一,而且这是被MySQL的数据库引擎处理的.当有很多相同的查询被执行了多次的时候,这 1. 为查询缓存优 ...

  3. cocos引擎v2.1版本android 编译问题解决办法 (cocos2d-x-3.4rc1)

    下载了最新版的cocos v2.1.2beta,使用cocos.exe来创建项目,而且在最下方的附件功能里还勾选了“支持x86架构cpu”这个选项,导致使用build_native.py编译不通过,以 ...

  4. 安装CDH4 (Cloudera Distribution Hadoop)步骤

    安装流程 机器和系统 3台服务器,安装centos 6.4 64bit系统,内存8G,磁盘60G,cpu单核 已配置好静态ip,并配置好/etc/hosts 下载cdh4版本 https://www. ...

  5. ZSDR017-客户订货价格和库存

    *----------------------------------------------------------------------*ZSDR017-客户订货价格和库存*---------- ...

  6. DB2中的ROW_NUMBER() OVER()函数用法

      ROW_NUMBER() OVER()大概有俩方面的作用 1,分页, 并返回分页结果集.2,是对数据进行处理 分组 db2的分页: select tmp.* from ( SELECT rownu ...

  7. 六个超大规模Hadoop(前景)

    http://cloud.zol.com.cn/441/4415033_all.html 希望自己可以尽快把Hadoop学好

  8. UVa 489 刽子手游戏

    游戏规则,计算机想一个单词让你猜,你每次可以猜一个字母,如果单词里有那个字母,所有该字母都会显示出来,如果没有那个字母则计算机会在一副"刽子手"画上填一笔,这幅画一共需要7笔就能完 ...

  9. 2-1-1 GDI

    主要内容:介绍Windows图形设备接口(GDI)及相关概念 1.Windows图形设备接口(GDI) <1>Windows图形设备接口(GDI),是为与设备无关的图形设计的.  所谓设备 ...

  10. android中ListView_SimpleAdapter

    1.首先看下main_activity.xml.其实里面就放了一个ListView. <LinearLayout xmlns:android="http://schemas.andro ...