0和1的个数之差

该博客讨论了一个字符串问题,其中字符串s由0和1组成,目标是找到无限字符串t的前缀,使得0和1的个数之差为特定值x。特殊情况下,当x不存在或有无穷多个解时,会分别返回0和-1。博主通过考虑特殊情况和使用map记录前缀个数差,提出了解决策略。
摘要由CSDN通过智能技术生成

题意:

   一个由0和1组成的字符串s,长度小于等于1e5,它可以构成字符串t, t=sssss....,t是无限长的。在t的前缀中(空串也是前缀)找出0的个数和1的个数之差(个数差记为d)为x的前缀,输出个数。x是在-1e9~1e9范围内。如果有无穷个则输出-1。

思路:

    首先考虑特殊情况。前缀个数为0的时候,是在s中不存在个数差d等于x的前缀,并且s中0和1的个数相同。

无穷个是s中存在个数差d等于x的前缀,且s中0和1的个数相同。

对于一般的情况,用map记录下所有前缀的个数差d的个数,还有出现的最大值最小值。然后从最小值开始遍历,找出符合的前缀,更新答案。

 

#pragma warning(disable:4996)
#include<iostream>
#include<cstring>
#include<cstdio>
#include<set>
#include<string>
#include<cmath>
#include<algorithm>
#include<map>
#include<queue>
using namespace std;
typedef long long ll;
char s[100005];
map<int, int>mp;
int main()
{
	int n, x, i, MAX, MIN, d, T;
	int cnt0, cnt1, ans;
	scanf("%d", &T);
	while (T--) {
		mp.clear();
		MAX = 0; MIN = 0; d = 0;
		ans
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 思路: 对于一个子串,若其0和1两种字符的个数相等,则其可以表示为“01”,“10”,“0101”,“1010”等形式,即0和1的交替出现。因此,我们可以遍历字符串,记录当前0和1的个数,若当前值为0,则说明找到了一个符合要求的子串。 具体地,我们可以维护一个计数器diff,表示当前0的个数减去1的个数,然后遍历字符串,对于每个字符,若是0,则将diff加1,若是1,则将diff减1。若此时diff为0,则说明找到了一个符合要求的子串。 代码: ### 回答2: 这是一个求解非空子串个数的问题。我们可以采用双层循环来解决。 首先,我们需要遍历字符串的每一个字符,作为子串的起始位置。然后,我们再从起始位置开始遍历到字符串结尾的位置,作为子串的结束位置。 在每一次遍历,我们需要统计子串0和1两种字符的个数。为了简化问题,我们可以使用两个变量来计数,一个变量count0用于统计0的个数,另一个变量count1用于统计1的个数。 在遍历的过程,如果我们发现0和1两个字符的个数相等,就说明满足题目要求,我们可以将结果加1。 下面是示例代码实现: ```python def countSubstring(s): res = 0 n = len(s) for i in range(n): count0 = count1 = 0 for j in range(i, n): if s[j] == '0': count0 += 1 else: count1 += 1 if count0 == count1: res += 1 return res s = input("请输入一个只包含0和1的字符串:") print("非空子串满足“0和1两种字符的个数相等”的个数为:", countSubstring(s)) ``` 请注意,这种方法的时间复杂度为O(n^2),其n为字符串的长度。如果字符串长度较大,可能会导致运行时间较长。 ### 回答3: 算法思路如下: 1. 初始化计数器count=0。 2. 遍历字符串的每个位置i。 3. 再次从位置i开始遍历字符串的每个位置j。 4. 对于位置i到j之间的子串,统计其0和1的个数。 5. 如果0和1的个数相等,count加1。 6. 返回count作为结果。 代码如下: ```python def countEqualSubstring(s): count = 0 for i in range(len(s)): # 遍历每个位置i zeros = 0 ones = 0 for j in range(i, len(s)): # 从位置i开始遍历每个位置j if s[j] == '0': zeros += 1 else: ones += 1 if zeros == ones: # 0和1的个数相等 count += 1 return count # 测试样例 s = "00110011" result = countEqualSubstring(s) print(result) # 输出结果为6 ``` 以上代码,通过双重循环遍历所有的子串,并在内层循环统计0和1的个数,如果个数相等,则计数器count加1。最后返回计数器count作为结果。例如对于字符串"00110011",有6个满足条件的子串:"0011"、"01"、"1100"、"10"、"001100"和"1100"。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值