/*======================================================================
字符串最大跨距
总时间限制: 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. Windows下adb push 总是提示Failed to copy "XX.apk" to 'system/app':Read-only file system

    一般情况看到这种提示我们会想到需要root权限,然后敲上adb remount,但是当我们执行过adb remount后,提示成功,但执行push命令依旧无法完成push. 那么此时我们的做法应该是重 ...

  2. css if hack之兼容ie

    1.Css if hack条件语法< !--[if IE]> Only IE <![endif]-->仅所有的WIN系统自带IE可识别< !--[if IE 5.0]&g ...

  3. Java 集合深入理解(10):Deque 双端队列

    点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 什么是 Deque Deque 是 Double ended queue (双端队列) 的缩写,读音和 deck 一样,蛋 ...

  4. Android Studio, gradle plugin is too old or set ANDROID_DAILY_OVERRIDE

    早上打开Android Studio,忽然报了个错,说gradle plugin版本过低,让更新或者设置ANDROID_DAILY_OVERRIDE环境变量: 日志如下: INFO - ls.idea ...

  5. array_count_values函数

    array_count_values() 函数用于统计数组中所有值出现的次数. 本函数返回一个数组,其元素的键名是原数组的值,键值是该值在原数组中出现的次数. 例子 <?php $a=array ...

  6. 【转】SQL SERVER日志满或过大的处理方法

    原文转自:http://blog.chinaunix.net/uid-7953959-id-2543262.html 事务日志文件Transaction Log File是用来记录数据库更新情况的文件 ...

  7. JQuery 实现倒计时

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. cannot find -lgcc_s

    在64位centos6上编译32位的汇编程序,如果程序中使用了C库,比如printf.因为是编译32位的目标程序,所以使用gcc编译的时候需要加上-m32选项,但是如果编译的话会报错,以print.s ...

  9. UI学习笔记---第二天

    程序的执行流程 一.自定义视图 自定义UILebal-UITextField视图 ⾃定义视图:系统标准UI之外,⾃己组合而出的新的视图. 实际开发中,我们还需⾃定义视图.积累⾃己的代码库.⽅便开发. ...

  10. centos网页乱码

    修改vi /etc/my.cnf  [client] (新增)default-character-set=utf8  [mysql] (添加)default-character-set=utf8