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

    Given an array of integers, return indices of the two numbers such that they add up to a specific ta ...

  2. IIS发布错误

    发布程序时遇到的错误:

  3. Unity3D ShaderLab 透明裁剪着色器

    Unity3D ShaderLab 透明裁剪着色器 上一篇,我们介绍了使用Alpha实现透明的手法,其实Unity为我们的#pragma提供了另一种参数,是我们能做出更高效 简单的透明效果,也就是裁剪 ...

  4. magento使用google analytics

    magento与google的很多功能是无缝集成的,这个展现了magento在seo方面的强大. 用了magento就不用傻到在页面里添加google analytic的跟踪代码了,激活google ...

  5. 阅读学术论文的心得体会from小木虫

    我们搞科研的很重要的一个环节就是文献的阅读!关于如何阅读文献?读什么,怎么读?结合我自己的体会,我想这里的关键在于要让我们通过这种方式的学习,学会看懂作者的思想.思路和科学方法,从中学习论文作者发现问 ...

  6. C语言redirection

    1)把执行文件xxx.exe 和读取的文件yyy.txt放在一个地方 2)用dos 命令 dir 和cd,打开存放文件的文件夹 3)window 7 情况下 输入xxx.exe < yyy.tx ...

  7. httpclient 发送一个请求

    httpclient版本 4.1 发送一个post请求 public static JSONObject post(String url,JSONObject json){ HttpClient cl ...

  8. iPhone不为人知的功能常用技巧,看完后才发现很多用iPhone的人实在是愧对乔布斯! - imsoft.cnblogs

    很多人花了四五千买部苹果,结果只用到四五百块钱的普通手机功能. iPhone不为人知的功能,常用技巧: 网上搜集整理的iPhone快捷键操作,虽然表面上iPhone按键只有一个HOME键,大部分操作都 ...

  9. html中的元素和节点

    元素(Element)和结点(Node)的区别, 元素是一个小范围的定义,必须是含有完整信息的结点才是一个元素,例如<div>...</div>. 但是一个结点不一定是一个元素 ...

  10. Linux下Find命令的使用

    Find命令的一般形式为: findpathname-options[-print-exec-ok] pathname:find命令所查找的目录路径.例如用.来表示当前目录,用/来表示系统根目录. - ...