给定一个整数K和一个长度为N的二进制字符串S ,任务是找出十进制等效值大于或等于K的子串的数量。
例子:
Input: K = 3, S = “11100”
Output: 8
Explanation:
There are 8 such substring whose decimal equivalent is greater than or equal to 3, as mentioned below:
Substring – Decimal Equivalent
“100” – 4,
“1100” – 12,
“11100” – 28,
“110” – 6,
“1110” – 14,
“11” – 3,
“111” – 7,
“11” – 3
Input: K = 5, S = “10110110”
Output: 19
Explanation:
There are 19 such substring whose decimal equivalent is greater than or equal to 5
朴素的方法:找出所有的子串,对于每个子串,将其从二进制转换为十进制并检查它是否大于或等于 K。计算找到的每个这样的子串的数量。
有效的方法:使用两点技术
- 这个想法是维护两个指针L和R 。
- 将子串的右指针 ‘R’ 的位置固定为length – 1并循环迭代,直到 R 的值为正:
- 将 L 的值初始化为 R,用于考虑长度为 1 的子串
- 将 L 的值减 1,直到长度为R – L + 1的子串的十进制等效值大于或等于 K
- 将计数器增加 L 左侧的位数。
下面是上述方法的实现:
C++
// C++ implementation to count the
// substrings whose decimal equivalent
// is greater than or equal to K
#include
using namespace std;
// Function to count number of
// substring whose decimal equivalent
// is greater than or equal to K
unsigned long long countSubstr(
string& s, int k)
{
int n = s.length();
// Left pointer of the substring
int l = n - 1;
// Right pointer of the substring
int r = n - 1;
int arr[n];
int last_indexof1 = -1;
// Loop to maintain the last
// occurrence of the 1 in the string
for (int i = 0; i < n; i++) {
if (s[i] == '1') {
arr[i] = i;
last_indexof1 = i;
}
else {
arr[i] = last_indexof1;
}
}
// Variable to count the substring
unsigned long long no_of_substr = 0;
// Loop to maintain the every
// possible end index of the substring
for (r = n - 1; r >= 0; r--) {
l = r;
// Loop to find the substring
// whose decimal equivalent is
// greater than or equal to K
while (l >= 0
&& (r - l + 1) <= 64
&& stoull(
s.substr(l, r - l + 1), 0, 2)
< k) {
l--;
}
// Condition to check no
// of bits is out of bound
if (r - l + 1 <= 64)
no_of_substr += l + 1;
else {
no_of_substr += arr[l + 1] + 1;
}
}
return no_of_substr;
}
// Driver Code
int main()
{
string s = "11100";
unsigned long long int k = 3;
cout << countSubstr(s, k);
}
Java
// Java implementation to count the
// subStrings whose decimal equivalent
// is greater than or equal to K
import java.util.*;
class GFG{
// Function to count number of
// subString whose decimal equivalent
// is greater than or equal to K
static long countSubstr(
String s, int k)
{
int n = s.length();
// Left pointer of the subString
int l = n - 1;
// Right pointer of the subString
int r = n - 1;
int []arr = new int[n];
int last_indexof1 = -1;
// Loop to maintain the last
// occurrence of the 1 in the String
for (int i = 0; i < n; i++) {
if (s.charAt(i) == '1') {
arr[i] = i;
last_indexof1 = i;
}
else {
arr[i] = last_indexof1;
}
}
// Variable to count the subString
long no_of_substr = 0;
// Loop to maintain the every
// possible end index of the subString
for (r = n - 1; r >= 0; r--) {
l = r;
// Loop to find the subString
// whose decimal equivalent is
// greater than or equal to K
while (l >= 0
&& (r - l + 1) <= 64
&& Integer.valueOf(s.substring(l, r + 1),2)
< k) {
l--;
}
// Condition to check no
// of bits is out of bound
if (r - l + 1 <= 64)
no_of_substr += l + 1;
else {
no_of_substr += arr[l + 1] + 1;
}
}
return no_of_substr;
}
// Driver Code
public static void main(String[] args)
{
String s = "11100";
int k = 3;
System.out.println(countSubstr(s, k));
}
}
// This code is contributed by PrinciRaj1992
Python3
# Python3 implementation to count the
# substrings whose decimal equivalent
# is greater than or equal to K
# Function to count number of
# substring whose decimal equivalent
# is greater than or equal to K
def countSubstr(s, k):
n = len(s)
# Left pointer of the substring
l = n - 1
# Right pointer of the substring
r = n - 1
arr = [0]*n
last_indexof1 = -1
# Loop to maintain the last
# occurrence of the 1 in the string
for i in range(n):
if (s[i] == '1'):
arr[i] = i
last_indexof1 = i
else:
arr[i] = last_indexof1
# Variable to count the substring
no_of_substr = 0
# Loop to maintain the every
# possible end index of the substring
for r in range(n - 1, -1, -1):
l = r
# Loop to find the substring
# whose decimal equivalent is
# greater than or equal to K
while (l >= 0 and (r - l + 1) <= 64 and int(s[l:r + 1], 2)< k):
l -= 1
# Condition to check no
# of bits is out of bound
if (r - l + 1 <= 64):
no_of_substr += l + 1
else:
no_of_substr += arr[l + 1] + 1
return no_of_substr
# Driver Code
s = "11100"
k = 3
print(countSubstr(s, k))
# This code is contributed by mohit kumar 29
C#
// C# implementation to count the
// subStrings whose decimal equivalent
// is greater than or equal to K
using System;
class GFG{
// Function to count number of
// subString whose decimal equivalent
// is greater than or equal to K
static long countSubstr(
String s, int k)
{
int n = s.Length;
// Left pointer of the subString
int l = n - 1;
// Right pointer of the subString
int r = n - 1;
int []arr = new int[n];
int last_indexof1 = -1;
// Loop to maintain the last
// occurrence of the 1 in the String
for (int i = 0; i < n; i++) {
if (s[i] == '1') {
arr[i] = i;
last_indexof1 = i;
}
else {
arr[i] = last_indexof1;
}
}
// Variable to count the subString
long no_of_substr = 0;
// Loop to maintain the every
// possible end index of the subString
for (r = n - 1; r >= 0; r--) {
l = r;
// Loop to find the subString
// whose decimal equivalent is
// greater than or equal to K
while (l >= 0
&& (r - l + 1) <= 64 && (int)(Convert.ToInt32(s.Substring(l, r + 1-l), 2))
< k) {
l--;
}
// Condition to check no
// of bits is out of bound
if (r - l + 1 <= 64)
no_of_substr += l + 1;
else {
no_of_substr += arr[l + 1] + 1;
}
}
return no_of_substr;
}
// Driver Code
public static void Main(String[] args)
{
String s = "11100";
int k = 3;
Console.WriteLine(countSubstr(s, k));
}
}
// This code is contributed by Rajput-Ji
输出:
8
如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live