给定二进制字符串str ,任务是计算可能的最大拆分,以使每个子字符串可以被给定的奇数K整除。
例子:
Input: str = “110111001”, K = 9
Output: 2
Explanation:
The two possible substrings are “11011” and “1001”. The equivalent decimal values are 27 and 9 respectively which are divisible by 9.
Input: str = “10111001”, K = 5
Output: 2
Explanation:
The two possible substrings are “101” and “11001”. The equivalent decimal values are 5 and 25 respectively which are divisible by 5.
方法:为了解决这个问题,我们从字符串的末尾开始遍历,生成遍历长度的总和。一旦总和可被K整除,我们将计数增加 1 并将总和重置为 0,然后向前遍历并重复相同的过程。在完全遍历字符串,如果sum已重置为 0,则计数值给出所需的最大可能拆分。否则,打印“不可能”,因为所有段都不能被K整除。
下面的代码是上述方法的实现:
C++
// C++ Program to split
// a given binary string
// into maximum possible
// segments divisible by
// given odd number K
#include
using namespace std;
// Function to calculate
// maximum splits possible
void max_segments(string str, int K)
{
int n = str.length();
int s = 0, sum = 0, count = 0;
for (int i = n - 1; i >= 0; i--) {
int a = str[i] - '0';
sum += a * pow(2, s);
s++;
if (sum != 0 && sum % K == 0) {
count++;
sum = 0;
s = 0;
}
}
if (sum != 0)
cout << "-1" << endl;
else
cout << count << endl;
}
// Driver code
int main()
{
string str = "10111001";
int K = 5;
max_segments(str, K);
return 0;
}
Java
// Java code to split a given
// binary string into maximum
// possible segments divisible
// by given odd number K
import java.io.*;
import java.util.*;
class GFG{
// Function to calculate
// maximum splits possible
static void rearrange(String str, int K)
{
int n = str.length();
int s = 0, sum = 0, count = 0;
for(int i = n - 1; i >= 0; i--)
{
int a = str.charAt(i) - '0';
sum += a * Math.pow(2, s);
s++;
if (sum != 0 && sum % K == 0)
{
count++;
sum = 0;
s = 0;
}
}
if (sum != 0)
System.out.println("-1");
else
System.out.println(count);
}
// Driver code
public static void main(String[] args)
{
String str = "10111001";
int K = 5;
rearrange(str, K);
}
}
// This code is contributed by coder001
Python3
# Python3 program to split
# a given binary string
# into maximum possible
# segments divisible by
# given odd number K
# Function to calculate
# maximum splits possible
def max_segments(st, K):
n = len(st)
s, sum, count = 0, 0, 0
for i in range(n - 1, -1, -1):
a = ord(st[i]) - 48
sum += a * pow(2, s)
s += 1
if (sum != 0 and sum % K == 0):
count += 1
sum = 0
s = 0
if (sum != 0):
print("-1")
else:
print(count)
# Driver code
if __name__ == "__main__":
st = "10111001"
K = 5
max_segments(st, K)
# This code is contributed by chitranayal
C#
// C# program to split a given
// binary string into maximum
// possible segments divisible by
// given odd number K
using System;
class GFG{
// Function to calculate
// maximum splits possible
static void max_segments(string str, int K)
{
int n = str.Length;
int s = 0;
int sum = 0;
int count = 0;
for(int i = n - 1; i >= 0; i--)
{
int a = str[i] - '0';
sum += a * (int)Math.Pow(2, s);
s++;
if (sum != 0 && sum % K == 0)
{
count++;
sum = 0;
s = 0;
}
}
if (sum != 0)
{
Console.Write("-1");
}
else
{
Console.Write(count);
}
}
// Driver code
public static void Main()
{
string str = "10111001";
int K = 5;
max_segments(str, K);
}
}
// This code is contributed by sayesha
Javascript
输出:
2
如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live