/*======================================================================
字符串最大跨距
总时间限制: 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. BZOJ 3251 树上三角形

    NOIP的东西回成都再说吧... 这题暴力. #include<iostream> #include<cstdio> #include<cstring> #incl ...

  2. PHP中的数组(二)常用数组处理函数

    数组的相关处理函数    一.数组键/值操作有关的函数        1.array_values()   无论是关联的还是索引的返回的都是索引数组 <?php $lamp=array(&quo ...

  3. HDU-4828 卡特兰数+带模除法

    题意:给定2行n列的长方形,然后把1—2*n的数字填进方格内,保证每一行,每一列都是递增序列,求有几种放置方法,对1000000007取余: 思路:本来想用组合数找规律,但是找不出来,搜题解是卡特兰数 ...

  4. HDU 4462

    http://acm.hdu.edu.cn/showproblem.php?pid=4462 一道题意不清的水题 题意:给一个n*n的格子,在上面放草人,每个草人有恐惧范围,问最少选择几个草人可以覆盖 ...

  5. Windows Phone 8.1 Page transitions

    original: http://www.visuallylocated.com/post/2014/06/24/Page-transitions-and-animations-in-Windows- ...

  6. 第一个Sprint冲刺第九天

    讨论成员:邵家文.李新.朱浩龙.陈俊金 工作:修改公式,修改bug

  7. Day03_JAVA语言基础第三天

    1.位运算符 1.面试题(掌握) ^:一个数据对同一个数据^两次,结果还是数据本身 举例:a ^ b ^ b = a  2.注意 知道结论,面试题,以后就完全不用看了 2.逻辑运算符(掌握)     ...

  8. 什么是JavaScript闭包终极全解之一——基础概念

    本文转自:http://www.cnblogs.com/richaaaard/p/4755021.html 什么是JavaScript闭包终极全解之一——基础概念 “闭包是JavaScript的一大谜 ...

  9. Java中生成随机字符的方法总结

    package learnExercise; public class RandomCharacter { public static char getRandomCharacter(char ch1 ...

  10. Sprint第二个冲刺(第五天)

    一.Sprint 计划会议: 容杰龙继续完善昨天的SQLite修改数据操作,待全部操作完善后交给炜杰进行布局规范和整合. 二.Sprint周期:   看板: 燃尽图: