本文概述
- C ++
- Java
- Python3
- C#
例子:
输入:K = 3, S =" 11100"简单的方法: 找出所有子串对于每个子字符串, 将其从二进制转换为十进制, 然后检查它是否大于或等于K。计算找到的每个此类子字符串的数量。
输出:8
说明:有8个这样的子字符串, 其十进制等效值大于或等于3, 如下所述:
子字符串–十进制等效值" 100" – 4, " 1100" – 12, " 11100" – 28, " 110" – 6, " 1110" – 14, " 11" – 3, " 111" – 7, " 11" – 3
输入:K = 5, S =" 10110110"
输出: 19
说明:有19个这样的子字符串, 其十进制等效值大于或等于5
高效方法:使用两指针技术
- 这个想法是要保持两分球 大号和[R.
- 将子字符串的右指针" R"的位置固定为长度– 1并循环循环直到R的值为正:
- 考虑长度1的子串, 将L的值初始化为R
- 将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 <
bits/stdc++.h>
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 = ielse :
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 ] + 1return no_of_substr# Driver Codes = "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
【十进制等效项大于或等于K的子字符串的计数】输出如下:
8
推荐阅读
- 如何开始软件测试职业-完整指南!
- PHP stream_get_transports()函数用法示例
- 修改给定数组以使奇数和偶数索引元素的总和相同
- 从OpenCV 2到OpenCV 3.x的过渡
- AWS中安全组和网络ACL之间的区别
- 8085程序以n个数字的数组搜索数字
- Android测试(从零开始3—— Instrumented单元测试1)
- Android 自动化测试框架
- Android开发BUG及解决方法2