给定大小为N的二进制字符串S ,任务是使给定字符串S的任何旋转的开始和结束处出现的连续0 s的计数总和最大化。
例子:
Input: S = “1001”
Output: 2
Explanation:
All possible rotations of the string are:
“1001”: Count of 0s at the start = 0, at the end = 0. Sum= 0 + 0 = 0.
“0011”: Count of 0s at the start = 2, at the end = 0. Sum = 2 + 0=2
“0110”: Count of 0s at the start = 1, at the end = 1. Sum= 1 + 1 = 2.
“1100”: Count of 0s at the start = 0, at the end = 2. Sum = 0 + 2 = 2
Therefore, maximum sum possible = 2.
Input: S = “01010”
Output: 2
Explanation:
All possible rotations of the string are:
“01010”: Count of 0s at the start = 1, at the end = 1. Sum= 1+1=1
“10100”: Count of 0s at the start = 0, at the end = 2. Sum= 0+2=2
“01001”: Count of 0s at the start = 1, at the end = 0. Sum= 1+0=1
“10010”: Count of 0s at the start = 0, at the end = 1. Sum= 0+1=1
“00101”: Count of 0s at the start = 2, at the end = 0. Sum= 2+0=2
Therefore, maximum sum possible = 2.
天真的方法:最简单的想法是生成给定字符串的所有旋转,并为每次旋转计算字符串开头和结尾处出现的0的数目并计算它们的总和。最后,打印获得的最大金额。
下面是上述方法的实现:
C++
// C++ program for the above approach
#include
using namespace std;
// Function to find the maximum sum of
// consecutive 0s present at the start
// and end of a string present in any
// of the rotations of the given string
void findMaximumZeros(string str, int n)
{
// Check if all the characters
// in the string are 0
int c0 = 0;
// Iterate over characters
// of the string
for (int i = 0; i < n; ++i) {
if (str[i] == '0')
c0++;
}
// If the frequency of '1' is 0
if (c0 == n) {
// Print n as the result
cout << n;
return;
}
// Concatenate the string
// with itself
string s = str + str;
// Stores the required result
int mx = 0;
// Generate all rotations of the string
for (int i = 0; i < n; ++i) {
// Store the number of consecutive 0s
// at the start and end of the string
int cs = 0;
int ce = 0;
// Count 0s present at the start
for (int j = i; j < i + n; ++j) {
if (s[j] == '0')
cs++;
else
break;
}
// Count 0s present at the end
for (int j = i + n - 1; j >= i; --j) {
if (s[j] == '0')
ce++;
else
break;
}
// Calculate the sum
int val = cs + ce;
// Update the overall
// maximum sum
mx = max(val, mx);
}
// Print the result
cout << mx;
}
// Driver Code
int main()
{
// Given string
string s = "1001";
// Store the size of the string
int n = s.size();
findMaximumZeros(s, n);
return 0;
}
Java
// Java program for the above approach
import java.util.*;
class GFG{
// Function to find the maximum sum of
// consecutive 0s present at the start
// and end of a string present in any
// of the rotations of the given string
static void findMaximumZeros(String str, int n)
{
// Check if all the characters
// in the string are 0
int c0 = 0;
// Iterate over characters
// of the string
for(int i = 0; i < n; ++i)
{
if (str.charAt(i) == '0')
c0++;
}
// If the frequency of '1' is 0
if (c0 == n)
{
// Print n as the result
System.out.print(n);
return;
}
// Concatenate the string
// with itself
String s = str + str;
// Stores the required result
int mx = 0;
// Generate all rotations of the string
for(int i = 0; i < n; ++i)
{
// Store the number of consecutive 0s
// at the start and end of the string
int cs = 0;
int ce = 0;
// Count 0s present at the start
for(int j = i; j < i + n; ++j)
{
if (s.charAt(j) == '0')
cs++;
else
break;
}
// Count 0s present at the end
for(int j = i + n - 1; j >= i; --j)
{
if (s.charAt(j) == '0')
ce++;
else
break;
}
// Calculate the sum
int val = cs + ce;
// Update the overall
// maximum sum
mx = Math.max(val, mx);
}
// Print the result
System.out.print(mx);
}
// Driver Code
public static void main(String[] args)
{
// Given string
String s = "1001";
// Store the size of the string
int n = s.length();
findMaximumZeros(s, n);
}
}
// This code is contributed by susmitakundugoaldanga
Python3
# Python3 program for the above approach
# Function to find the maximum sum of
# consecutive 0s present at the start
# and end of a string present in any
# of the rotations of the given string
def findMaximumZeros(st, n):
# Check if all the characters
# in the string are 0
c0 = 0
# Iterate over characters
# of the string
for i in range(n):
if (st[i] == '0'):
c0 += 1
# If the frequency of '1' is 0
if (c0 == n):
# Print n as the result
print(n)
return
# Concatenate the string
# with itself
s = st + st
# Stores the required result
mx = 0
# Generate all rotations of the string
for i in range(n):
# Store the number of consecutive 0s
# at the start and end of the string
cs = 0
ce = 0
# Count 0s present at the start
for j in range(i, i + n):
if (s[j] == '0'):
cs += 1
else:
break
# Count 0s present at the end
for j in range(i + n - 1, i - 1, -1):
if (s[j] == '0'):
ce += 1
else:
break
# Calculate the sum
val = cs + ce
# Update the overall
# maximum sum
mx = max(val, mx)
# Print the result
print(mx)
# Driver Code
if __name__ == "__main__":
# Given string
s = "1001"
# Store the size of the string
n = len(s)
findMaximumZeros(s, n)
# This code is contributed by ukasp.
C#
// C# program for the above approach
using System;
class GFG{
// Function to find the maximum sum of
// consecutive 0s present at the start
// and end of a string present in any
// of the rotations of the given string
static void findMaximumZeros(string str, int n)
{
// Check if all the characters
// in the string are 0
int c0 = 0;
// Iterate over characters
// of the string
for(int i = 0; i < n; ++i)
{
if (str[i] == '0')
c0++;
}
// If the frequency of '1' is 0
if (c0 == n)
{
// Print n as the result
Console.Write(n);
return;
}
// Concatenate the string
// with itself
string s = str + str;
// Stores the required result
int mx = 0;
// Generate all rotations of the string
for(int i = 0; i < n; ++i)
{
// Store the number of consecutive 0s
// at the start and end of the string
int cs = 0;
int ce = 0;
// Count 0s present at the start
for(int j = i; j < i + n; ++j)
{
if (s[j] == '0')
cs++;
else
break;
}
// Count 0s present at the end
for(int j = i + n - 1; j >= i; --j)
{
if (s[j] == '0')
ce++;
else
break;
}
// Calculate the sum
int val = cs + ce;
// Update the overall
// maximum sum
mx = Math.Max(val, mx);
}
// Print the result
Console.Write(mx);
}
// Driver Code
public static void Main(string[] args)
{
// Given string
string s = "1001";
// Store the size of the string
int n = s.Length;
findMaximumZeros(s, n);
}
}
// This code is contributed by AnkThon
C++
// C++ program for the above approach
#include
using namespace std;
// Function to find the maximum sum of
// consecutive 0s present at the start
// and end of any rotation of the string str
void findMaximumZeros(string str, int n)
{
// Stores the count of 0s
int c0 = 0;
for (int i = 0; i < n; ++i) {
if (str[i] == '0')
c0++;
}
// If the frequency of '1' is 0
if (c0 == n) {
// Print n as the result
cout << n;
return;
}
// Stores the required sum
int mx = 0;
// Find the maximum consecutive
// length of 0s present in the string
int cnt = 0;
for (int i = 0; i < n; i++) {
if (str[i] == '0')
cnt++;
else {
mx = max(mx, cnt);
cnt = 0;
}
}
// Update the overall maximum sum
mx = max(mx, cnt);
// Find the number of 0s present at
// the start and end of the string
int start = 0, end = n - 1;
cnt = 0;
// Update the count of 0s at the start
while (str[start] != '1' && start < n) {
cnt++;
start++;
}
// Update the count of 0s at the end
while (str[end] != '1' && end >= 0) {
cnt++;
end--;
}
// Update the maximum sum
mx = max(mx, cnt);
// Print the result
cout << mx;
}
// Driver Code
int main()
{
// Given string
string s = "1001";
// Store the size of the string
int n = s.size();
findMaximumZeros(s, n);
return 0;
}
Java
// Java program for the above approach
import java.util.*;
class GFG{
// Function to find the maximum sum of
// consecutive 0s present at the start
// and end of any rotation of the string str
static void findMaximumZeros(String str, int n)
{
// Stores the count of 0s
int c0 = 0;
for(int i = 0; i < n; ++i)
{
if (str.charAt(i) == '0')
c0++;
}
// If the frequency of '1' is 0
if (c0 == n)
{
// Print n as the result
System.out.print(n);
return;
}
// Stores the required sum
int mx = 0;
// Find the maximum consecutive
// length of 0s present in the string
int cnt = 0;
for(int i = 0; i < n; i++)
{
if (str.charAt(i) == '0')
cnt++;
else
{
mx = Math.max(mx, cnt);
cnt = 0;
}
}
// Update the overall maximum sum
mx = Math.max(mx, cnt);
// Find the number of 0s present at
// the start and end of the string
int start = 0, end = n - 1;
cnt = 0;
// Update the count of 0s at the start
while (str.charAt(start) != '1' && start < n)
{
cnt++;
start++;
}
// Update the count of 0s at the end
while (str.charAt(end) != '1' && end >= 0)
{
cnt++;
end--;
}
// Update the maximum sum
mx = Math.max(mx, cnt);
// Print the result
System.out.println(mx);
}
// Driver Code
public static void main (String[] args)
{
// Given string
String s = "1001";
// Store the size of the string
int n = s.length();
findMaximumZeros(s, n);
}
}
// This code is contributed by sanjoy_62
Python3
# Python3 program for the above approach
# Function to find the maximum sum of
# consecutive 0s present at the start
# and end of any rotation of the string str
def findMaximumZeros(string, n):
# Stores the count of 0s
c0 = 0
for i in range(n):
if (string[i] == '0'):
c0 += 1
# If the frequency of '1' is 0
if (c0 == n):
# Print n as the result
print(n, end = "")
return
# Stores the required sum
mx = 0
# Find the maximum consecutive
# length of 0s present in the string
cnt = 0
for i in range(n):
if (string[i] == '0'):
cnt += 1
else:
mx = max(mx, cnt)
cnt = 0
# Update the overall maximum sum
mx = max(mx, cnt)
# Find the number of 0s present at
# the start and end of the string
start = 0
end = n - 1
cnt = 0
# Update the count of 0s at the start
while (string[start] != '1' and start < n):
cnt += 1
start += 1
# Update the count of 0s at the end
while (string[end] != '1' and end >= 0):
cnt += 1
end -= 1
# Update the maximum sum
mx = max(mx, cnt)
# Print the result
print(mx, end = "")
# Driver Code
if __name__ == "__main__":
# Given string
s = "1001"
# Store the size of the string
n = len(s)
findMaximumZeros(s, n)
# This code is contributed by AnkThon
C#
// C# program for the above approach
using System;
class GFG{
// Function to find the maximum sum of
// consecutive 0s present at the start
// and end of any rotation of the string str
static void findMaximumZeros(string str, int n)
{
// Stores the count of 0s
int c0 = 0;
for(int i = 0; i < n; ++i)
{
if (str[i] == '0')
c0++;
}
// If the frequency of '1' is 0
if (c0 == n)
{
// Print n as the result
Console.Write(n);
return;
}
// Stores the required sum
int mx = 0;
// Find the maximum consecutive
// length of 0s present in the string
int cnt = 0;
for(int i = 0; i < n; i++)
{
if (str[i] == '0')
cnt++;
else
{
mx = Math.Max(mx, cnt);
cnt = 0;
}
}
// Update the overall maximum sum
mx = Math.Max(mx, cnt);
// Find the number of 0s present at
// the start and end of the string
int start = 0, end = n - 1;
cnt = 0;
// Update the count of 0s at the start
while (str[start] != '1' && start < n)
{
cnt++;
start++;
}
// Update the count of 0s at the end
while (str[end] != '1' && end >= 0)
{
cnt++;
end--;
}
// Update the maximum sum
mx = Math.Max(mx, cnt);
// Print the result
Console.Write(mx);
}
// Driver Code
static public void Main ()
{
// Given string
string s = "1001";
// Store the size of the string
int n = s.Length;
findMaximumZeros(s, n);
}
}
// This code is contributed by avijitmondal1998
2
时间复杂度: O(N 2 )
辅助空间: O(N)
高效的方法:这个想法是找到给定字符串中连续0的最大数目。还要在字符串的开头和结尾处找到连续的0 s的总和,然后从中打印出最大值。
请按照以下步骤解决问题:
- 检查字符串“ S ”中“ 1”的频率是否等于0 。如果发现为真,则打印N的值作为结果。
- 否则,请执行以下步骤:
- 将给定字符串中最大连续0数存储在变量X中。
- 初始化两个变量,从0开始,以N-1结束。
- 当S [start]不等于“ 1 ”时,将cnt的值增加并从1开始。
- 递增1 CNT和递减端的值,而S [结束]不等于“1”。
- 打印X和cnt的最大值作为结果。
下面是上述方法的实现:
C++
// C++ program for the above approach
#include
using namespace std;
// Function to find the maximum sum of
// consecutive 0s present at the start
// and end of any rotation of the string str
void findMaximumZeros(string str, int n)
{
// Stores the count of 0s
int c0 = 0;
for (int i = 0; i < n; ++i) {
if (str[i] == '0')
c0++;
}
// If the frequency of '1' is 0
if (c0 == n) {
// Print n as the result
cout << n;
return;
}
// Stores the required sum
int mx = 0;
// Find the maximum consecutive
// length of 0s present in the string
int cnt = 0;
for (int i = 0; i < n; i++) {
if (str[i] == '0')
cnt++;
else {
mx = max(mx, cnt);
cnt = 0;
}
}
// Update the overall maximum sum
mx = max(mx, cnt);
// Find the number of 0s present at
// the start and end of the string
int start = 0, end = n - 1;
cnt = 0;
// Update the count of 0s at the start
while (str[start] != '1' && start < n) {
cnt++;
start++;
}
// Update the count of 0s at the end
while (str[end] != '1' && end >= 0) {
cnt++;
end--;
}
// Update the maximum sum
mx = max(mx, cnt);
// Print the result
cout << mx;
}
// Driver Code
int main()
{
// Given string
string s = "1001";
// Store the size of the string
int n = s.size();
findMaximumZeros(s, n);
return 0;
}
Java
// Java program for the above approach
import java.util.*;
class GFG{
// Function to find the maximum sum of
// consecutive 0s present at the start
// and end of any rotation of the string str
static void findMaximumZeros(String str, int n)
{
// Stores the count of 0s
int c0 = 0;
for(int i = 0; i < n; ++i)
{
if (str.charAt(i) == '0')
c0++;
}
// If the frequency of '1' is 0
if (c0 == n)
{
// Print n as the result
System.out.print(n);
return;
}
// Stores the required sum
int mx = 0;
// Find the maximum consecutive
// length of 0s present in the string
int cnt = 0;
for(int i = 0; i < n; i++)
{
if (str.charAt(i) == '0')
cnt++;
else
{
mx = Math.max(mx, cnt);
cnt = 0;
}
}
// Update the overall maximum sum
mx = Math.max(mx, cnt);
// Find the number of 0s present at
// the start and end of the string
int start = 0, end = n - 1;
cnt = 0;
// Update the count of 0s at the start
while (str.charAt(start) != '1' && start < n)
{
cnt++;
start++;
}
// Update the count of 0s at the end
while (str.charAt(end) != '1' && end >= 0)
{
cnt++;
end--;
}
// Update the maximum sum
mx = Math.max(mx, cnt);
// Print the result
System.out.println(mx);
}
// Driver Code
public static void main (String[] args)
{
// Given string
String s = "1001";
// Store the size of the string
int n = s.length();
findMaximumZeros(s, n);
}
}
// This code is contributed by sanjoy_62
Python3
# Python3 program for the above approach
# Function to find the maximum sum of
# consecutive 0s present at the start
# and end of any rotation of the string str
def findMaximumZeros(string, n):
# Stores the count of 0s
c0 = 0
for i in range(n):
if (string[i] == '0'):
c0 += 1
# If the frequency of '1' is 0
if (c0 == n):
# Print n as the result
print(n, end = "")
return
# Stores the required sum
mx = 0
# Find the maximum consecutive
# length of 0s present in the string
cnt = 0
for i in range(n):
if (string[i] == '0'):
cnt += 1
else:
mx = max(mx, cnt)
cnt = 0
# Update the overall maximum sum
mx = max(mx, cnt)
# Find the number of 0s present at
# the start and end of the string
start = 0
end = n - 1
cnt = 0
# Update the count of 0s at the start
while (string[start] != '1' and start < n):
cnt += 1
start += 1
# Update the count of 0s at the end
while (string[end] != '1' and end >= 0):
cnt += 1
end -= 1
# Update the maximum sum
mx = max(mx, cnt)
# Print the result
print(mx, end = "")
# Driver Code
if __name__ == "__main__":
# Given string
s = "1001"
# Store the size of the string
n = len(s)
findMaximumZeros(s, n)
# This code is contributed by AnkThon
C#
// C# program for the above approach
using System;
class GFG{
// Function to find the maximum sum of
// consecutive 0s present at the start
// and end of any rotation of the string str
static void findMaximumZeros(string str, int n)
{
// Stores the count of 0s
int c0 = 0;
for(int i = 0; i < n; ++i)
{
if (str[i] == '0')
c0++;
}
// If the frequency of '1' is 0
if (c0 == n)
{
// Print n as the result
Console.Write(n);
return;
}
// Stores the required sum
int mx = 0;
// Find the maximum consecutive
// length of 0s present in the string
int cnt = 0;
for(int i = 0; i < n; i++)
{
if (str[i] == '0')
cnt++;
else
{
mx = Math.Max(mx, cnt);
cnt = 0;
}
}
// Update the overall maximum sum
mx = Math.Max(mx, cnt);
// Find the number of 0s present at
// the start and end of the string
int start = 0, end = n - 1;
cnt = 0;
// Update the count of 0s at the start
while (str[start] != '1' && start < n)
{
cnt++;
start++;
}
// Update the count of 0s at the end
while (str[end] != '1' && end >= 0)
{
cnt++;
end--;
}
// Update the maximum sum
mx = Math.Max(mx, cnt);
// Print the result
Console.Write(mx);
}
// Driver Code
static public void Main ()
{
// Given string
string s = "1001";
// Store the size of the string
int n = s.Length;
findMaximumZeros(s, n);
}
}
// This code is contributed by avijitmondal1998
2
时间复杂度: O(N)
辅助空间: O(1)