时间限制 : - MS 空间限制 : - KB ![]() |
评测说明 : 1s,128m |
问题描述
同学们总想AK。
于是何老板给出一个由大写字母构成的字符串,他想你帮忙找出其中距离最远的一对'A'和'K'。
比如下列字符串:
BKABGKWAXKA
距离最远一对'A'和'K'的间距为6,它们之间间隔了6个字符。
输入格式
一行,一个由大写字母构成的字符串
输出格式
一个整数,表示A和K最远的间距。要求A必须在K的左侧,如果不存在,输出-1
样例输入 1
BKABGKWAXKA
样例输出 1
6
样例输入 2
KKKKKKKKKKAAAAAAAAAAAAAAA
样例输出 2
-1
提示
1<=字符串的长度<=10000
【分析】
第一道,肯定是签到题。按照题目德意思从字符串最前面找到第一个‘A’的下标,和最后面找到第一个‘K’的下标,相减即可。
【标程】
1 #include<iostream> 2 using namespace std; 3 int Left, Right, L, R; 4 bool K_L, K_R; // 用于标记是否找到 5 string S; 6 void ini() { 7 ios::sync_with_stdio(false); 8 cin >> S; 9 } 10 void solve() { 11 Left = 0; 12 Right = S.length(); 13 while (!K_L || !K_R) { 14 if (S[Left] != 'A')++ Left; 15 else L = Left, K_L = 1; 16 if (S[Right] != 'K')-- Right; 17 else R = Right, K_R = 1; 18 if (Left > Right)break; // 特判是否无解,防止死循环 19 } 20 if (K_L && K_R) 21 printf("%d", R - L - 1); 22 else printf("-1"); 23 } 24 int main() { 25 ini(); 26 solve(); 27 return 0; 28 }
另:
这是@羽错光阴 童鞋的代码,也略有借鉴之处——
1 #include<cstdio> 2 using namespace std; 3 char A[10005], c = 'A'; 4 int i = 1, pos, pos2; 5 int main(){ 6 while(c >= 'A' && c <= 'Z'){ 7 c = getchar(); 8 A[i ++] = c; 9 } 10 for (pos = 1; pos <= i; pos ++)if (A[pos] =='A')break; 11 for (pos2 = i; pos2 >= 1; pos2 --)if (A[pos2] == 'K')break; 12 if (pos2 <= pos || pos2 == 0 || pos == i) { 13 puts("-1"); 14 return 0; 15 } 16 printf("%d", pos2 - pos - 1); 17 }
其中的读入部分:
while(c >= 'A' && c <= 'Z')
因为空格不属于字母范围,成功且简便地解决了读入问题。