Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

นับจำนวนสตริงย่อยด้วยอักขระที่แตกต่างกัน k ตัวใน C++


กำหนดสตริง str[] ที่มีตัวอักษรพิมพ์เล็กเท่านั้นและค่าจำนวนเต็ม k เป้าหมายคือการค้นหาจำนวนสตริงย่อยที่เป็นไปได้ของ str ที่มีองค์ประกอบที่แตกต่างกัน k ตัว

ตัวอย่าง

อินพุต

str= ”pqr” k=2

ผลลัพธ์

Count of number of substrings with exactly k distinct characters are: 2

คำอธิบาย

The substrings having exactly 2 distinct elements are: “pq”, “qr”.

อินพุต

str= ”stristr” k=4

ผลลัพธ์

Count of number of substrings with exactly k distinct characters are: 10

คำอธิบาย

The substrings having exactly 2 distinct elements are:
“stri”, “tris”, “rist”, “istr”, “stris”, “trist”, “ristr”, “strist”, “tristr”, “stristr”.

แนวทางที่ใช้ในโปรแกรมด้านล่างมีดังนี้

ในแนวทางนี้ เราจะใช้อาร์เรย์อาร์เรย์[26] เพื่อเก็บความถี่ของตัวอักษรภาษาอังกฤษไว้ในสตริง str ตอนนี้ข้าม str โดยใช้สองลูป ถ้าสำหรับสตริงย่อย อักขระแต่ละตัวจะเกิดขึ้นครั้งเดียว จากนั้นเพิ่มจำนวนอักขระที่ไม่ซ้ำ ที่ส่วนท้ายของสตริงย่อยนั้นหากการนับนั้นเท่ากับ k ให้นับสตริงย่อยเพิ่มขึ้นตามเงื่อนไขที่กำหนด

  • รับสตริงสตริงเป็นอินพุต

  • หาจำนวนเต็ม k ด้วยค่าบวก

  • ฟังก์ชัน substring_k(string str, int length, int k) รับ str และ k และคืนค่าจำนวนสตริงย่อยที่มีอักขระต่างกัน k ตัว

  • นับเริ่มต้นเป็น 0

  • ใช้อาร์เรย์อาร์เรย์ความถี่[26].

  • ข้าม str โดยใช้สองลูปจาก i=0 ถึง i

  • ใช้ temp เป็นจำนวนองค์ประกอบที่ไม่ซ้ำในสตริงย่อย str[i ถึง j]

  • หาก array[str[j] − 'a']==0 แสดงว่าอักขระนี้ str[j] เกิดขึ้นครั้งแรกในสตริงย่อยนี้ อุณหภูมิที่เพิ่มขึ้นดังนั้น

  • ตอนนี้เพิ่มจำนวนอักขระปัจจุบันโดยใช้ array[str[j] - 'a']++

  • หากอุณหภูมิเท่ากับ k ให้นับการเพิ่ม

  • หากอุณหภูมิมากกว่า k ให้หยุดการเดินทางต่อไปและทำลายวงจร

  • ที่ส่วนท้ายของการวนซ้ำทั้งหมดจะนับเป็นผลลัพธ์

ตัวอย่าง

#include<bits/stdc++.h>
using namespace std;
int substring_k(string str, int length, int k){
   int count = 0;
   int array[26];
   for (int i = 0; i < length; i++){
      int temp = 0;
      memset(array, 0, sizeof(array));
      for (int j = i; j < length; j++){
         if(array[str[j] − 'a'] == 0){
            temp++;
         }
         array[str[j] − 'a']++;
         if (temp == k){
            count++;
         }
         if(temp > k){
            break;
         }
      }
   }
   return count;
}
int main(){
   string str = "abc";
   int length = str.length();
   int k = 1;
   cout<<"Count of number of substrings with exactly k distinct characters are: "<<substring_k(str, length, k);
   return 0;
}

ผลลัพธ์

หากเราเรียกใช้โค้ดข้างต้น มันจะสร้างผลลัพธ์ต่อไปนี้ -

Count of number of substrings with exactly k distinct characters are: 3