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。
========================================================================*/
#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计算概论-字符串最大跨距的更多相关文章
- OpenJudge计算概论-字符串排序
/*====================================================================== 字符串排序 总时间限制: 1000ms 内存限制: 6 ...
- OpenJudge计算概论-取石子游戏
OpenJudge计算概论-取石子游戏[函数递归练习] /*====================================================================== ...
- Openjudge计算概论——数组逆序重放【递归练习】
/*===================================== 数组逆序重放 总时间限制:1000ms 内存限制:65536kB 描述 将一个数组中的值按逆序重新存放. 例如,原来的顺 ...
- OpenJudge计算概论-计算书费
/*============================================== 计算书费 总时间限制: 1000ms 内存限制: 65536kB 描述 下面是一个图书的单价表: 计算 ...
- OpenJudge计算概论-最高的分数
/*======================================================== 最高的分数 总时间限制: 1000ms 内存限制: 65536kB 描述 孙老师 ...
- OpenJudge计算概论-求特殊自然数【枚举法】【将整数转成字符串】
/*======================================================================== 求特殊自然数 总时间限制: 1000ms 内存限制 ...
- OpenJudge计算概论-忽略大小写比较字符串大小
/*======================================================================= 忽略大小写比较字符串大小 总时间限制: 1000ms ...
- Openjudge计算概论-求序列中的众数
/*===================================== 求序列中的众数 总时间限制: 1000ms 内存限制: 65536kB 描述 输入一个长度为N的整数序列 (不多于128 ...
- OpenJudge计算概论-比饭量【枚举法、信息数字化】
/*====================================================================== 比饭量 总时间限制: 1000ms 内存限制: 655 ...
随机推荐
- 【LeetCode】Rotate Array
Rotate Array Rotate an array of n elements to the right by k steps. For example, with n = 7 and k = ...
- Android之Activity与Service通信
一.当Acitivity和Service处于同一个Application和进程时,通过继承Binder类来实现. 当一个Activity绑定到一个Service上时,它负责维护Service实例的引用 ...
- C#不安全代码和指针
从通常情况下来看,为了保持类型安全,默认情况C# 不支持指针算法. 不过,当你需要使用指针的时候,请通过使用 unsafe 关键字,可以定义可使用指针的不安全上下文. 有关指针的更多信息,请参见主题指 ...
- 负margin居中
<!DOCTYPE html><html> <head> <title> new document </title> <meta na ...
- NSDictionary 、 NSMutableDictionary
1 重构学生与学校的练习 1.1 问题 本案例要求用字典解决下述问题.问题是:有一个学校,该学校有两个学院,每个学院中又有两个班级,而在每个班级中有两名学生. 现在作如下要求: 1)显示所有学生的信息 ...
- 四、CCSprite
在介绍CCSprite之前,先要理解游戏开发中的一个核心概念:精灵.精灵也称为游戏对象,它可以用来表示游戏中的任何物体,比如敌人.子弹.甚至是一个背景图片.一段文字.CCSprite可以说是在coco ...
- 《JavaScript Ninja》之正则表达式
正则表达式 是一个拆分字符串并查询相关信息的过程. 练习网站:JS Bin 正则表达式测试网站:Regular Expression Test Page for JavaScript 正则表达式进修 ...
- 【题解】【字符串】【Leetcode】Valid Palindrome
Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignori ...
- OpenFlow Switch学习笔记(二)——OpenFlow Ports
OpenFlow Ports是OpenFlow Switch与剩余网络之间传递Packet的网络接口.OpenFlow Switches之间通过OpenFlow Ports彼此相互逻辑连接.一个Ope ...
- PE安装原版XP系统(含高版本PE安装选项灰色处理办法)
PE 安装 XP 镜像流程准备原版 XP 安装光盘镜像放到硬盘非 C 盘. 可解压到本地经行安装, 也可以使用虚拟光驱载入安装 (本教程主要讲 PE 内虚拟光驱载入安装) 第一步:用 U 盘或硬盘/光 ...