金榜题名萱头像

蓝桥杯LV1 - 小郑的蓝桥平衡串(前缀和)

问题描述

平衡串指的是一个字符串,其中包含两种不同字符,并且这两种字符的数量相等。

例如,abababababab 和 aababbaababb 都是平衡串,因为每种字符各有三个,而 abaababaab 和 aaaabaaaab 都不是平衡串,因为它们的字符数量不相等。

平衡串在密码学和计算机科学中具有重要应用,比如可以用于构造哈希函数或者解决一些数学问题。

小郑拿到一个只包含 L、Q 的字符串,他的任务就是找到最长平衡串,且满足平衡串的要求,即保证子串中 L、Q 的数量相等。

输入格式

输入一行字符串,保证字符串中只包含字符 L、Q。

输出格式

输出一个整数,为输入字符串中最长平衡串的长度。

样例输入

LQLL

样例输出

2

解题思路


1. 字符映射:L看成+1,Q看成-1。
如果一段区间内 L 和 Q 数量相等,这段区间所有数字加起来总和 = 0。
2. 前缀和结论:
区间  [l+1, r]  和 = sum[r] - sum[l]
和为0等价于: sum[r] == sum[l] 
两个位置前缀和相等,中间这一段就是平衡串
3. 数组 bj[] 充当记录本:保存这个sum值第一次出现的标记位置。只存第一次,后面再次碰到相同sum,算出来的长度才是最大。
4.  +1000:sum会出现负数,C语言不允许负下标,sum+1000平移到0~2000。
5. 循环写法(i从0开始,直接访问 s[i] ,不用i-1,不容易写错)
注意: i 是字符串下标,读完 s[i] 对应的前缀和标记位置是  i+1 (变成长度位置)

完整代码

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

int bj[2007];

int main(int argc, char *argv[])

{

 int i;

 for(i=0;i<=2007;i++)

 {

   bj[i]=-1;

 }

 char s[1000];

 scanf("%s",s);

 int n=strlen(s);

 int sum=0;

 int maxlen=0;

 for(i=0;i<n;i++)

 {

   int L=0,Q=0;

   if(s[i]=='L')

   {

     sum++;

   }

   else

   {

     sum--;

   }

   int pos=sum+1000;

   if(bj[pos]!=-1)

   {

     int len=(i+1)-bj[pos];

     if(len>maxlen)

     {

       maxlen=len;

     }

   }

   else

   {

     bj[pos]=i+1;

   }

 }

 printf("%d\n",maxlen);

 return 0;

}

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/2402_87421821/article/details/170448283

文章来源转载

评论

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--