สมมติว่าเราได้กำหนดความยาวของสตริง 'str' และสตริง ภารกิจคือการนับจำนวนสตริงย่อยที่ขึ้นต้นด้วย '1' และลงท้ายด้วย '1' ใน Binary String ที่กำหนด สตริงไบนารีประกอบด้วย '1' และ '0' เท่านั้น ตัวอย่างเช่น
อินพุต-1 −
N = 5 str = ‘11101’
ผลผลิต −
6
คำอธิบาย − ใน Binary String ที่กำหนด เรามี 6 สตริงย่อยที่ขึ้นต้นด้วย '1' และลงท้ายด้วย '1' ชุดของสตริงย่อยเหล่านี้คือ {'11', '111', '1110', '11101', '1101', '101'}
อินพุต-1 −
N = 4 str = ‘0011’
ผลผลิต −
1
คำอธิบาย −
ใน Binary String ที่กำหนด เรามี 1 สตริงย่อยที่ขึ้นต้นด้วย '1' และลงท้ายด้วย '1' ชุดของสตริงย่อยเหล่านี้เป็นชุดซิงเกิลตัน เช่น { '11 '}.
แนวทางที่ใช้ในการแก้ปัญหานี้
สำหรับสตริงที่กำหนด เราต้องนับจำนวนสตริงย่อยที่ขึ้นต้นด้วย "1" และลงท้ายด้วย "1" ปัญหานี้คล้ายกับปัญหา Handshake ที่รู้จักกันดี ซึ่งเราต้องนับจำนวนการจับมือในปาร์ตี้ของคน 'n'
หากเรานับจำนวน 1 ในสตริงที่กำหนด เราจะพบชุดของสตริงย่อยที่ขึ้นต้นด้วย "1" และลงท้ายด้วย "1"
-
รับอินพุตสตริงที่มีความยาว N
-
ฟังก์ชัน Integer countSubstring(int N, string s) ใช้ความยาวของสตริงและสตริงเป็นอินพุต และส่งคืนค่าจำนวนสตริงย่อยทั้งหมดที่ขึ้นต้นด้วย '1' และลงท้ายด้วย '1'
-
วนซ้ำตลอดทั้งสตริงและนับจำนวน ของ '1' ในสตริง
-
นับเลขที่ ของสตริงย่อย (คู่) ในสตริงที่กำหนดโดย n*(n-1)/2.
-
ส่งกลับผลลัพธ์ของ n*(n-1)/2.
ตัวอย่าง
#include<iostream>
using namespace std;
int countSubstring(int N, string s){
int count=0;
for(int i=0; s[i]!= '\0'; ++i){
if( s[i]== '1' )
count++;
}
return count*(count-1)/2;
}
int main() {
int N=5;
string str= "11101";
cout<< countSubstring(N,str)<<endl;
return 0;
} ผลลัพธ์
หากเราจะเรียกใช้โค้ดข้างต้น มันจะพิมพ์ผลลัพธ์เป็น,
6
เนื่องจากจำนวน '1' ที่มีอยู่ในสตริงที่กำหนดคือ '4' เช่น count =4 จำนวนทั้งหมดของสตริงย่อยที่ขึ้นต้นด้วย '1' และลงท้ายด้วย '1' คือ 4*(4-1)/2 =6.