เราได้รับสตริง str[] เป็นอินพุต เป้าหมายคือการนับจำนวนสตริงย่อยแอนนาแกรมที่มีอยู่ใน str[] สองสตริงเป็นแอนนาแกรมของกันและกัน หากมีจำนวนอักขระเท่ากัน และอักขระทั้งหมดเกิดขึ้นในทั้งสอง ลำดับของอักขระอาจแตกต่างกัน
“abc” คือแอนนาแกรมของ “cba”, “bca” เป็นต้น
ให้เราเข้าใจด้วยตัวอย่าง
ป้อนข้อมูล − str[] =“abccb”
ผลผลิต − จำนวนของสตริงย่อยแอนนาแกรมทั้งหมดคือ − 4
คำอธิบาย − แอนนาแกรม ได้แก่ − (b,b), (c,c), (bc,cb), (bcc,ccb)
ป้อนข้อมูล − str =“aaa”
ผลผลิต − จำนวนของสตริงย่อยแอนนาแกรมทั้งหมดคือ − 4
คำอธิบาย − แอนนาแกรม ได้แก่ − (a,a), (a,a), (a,a), (aa,aa)
แนวทางที่ใช้ในโปรแกรมด้านล่างมีดังนี้
เรากำลังนำแผนที่ที่มีเวกเตอร์ที่มีความถี่ของตัวอักษรภาษาอังกฤษเป็นสตริงย่อยและนับจำนวนสตริงย่อยดังกล่าวในอาร์เรย์ ใน map
-
ใช้สตริง str[] เป็นอาร์เรย์อักขระ
-
ฟังก์ชัน anagram_substring(string str, int length) รับสตริงและส่งกลับจำนวนสตริงย่อยแอนนาแกรมทั้งหมด
-
นับเริ่มต้นเป็น 0
-
นำแผนที่ map
, int> mp_vec; -
ข้าม str[] โดยใช้สองลูปจาก i=0 ถึง i
-
สำหรับแต่ละสตริงย่อย str[i ถึง j] เวกเตอร์
vec(MAX, 0); จะมีตัวอักษรภาษาอังกฤษอยู่ในนั้น -
ใช้อักขระปัจจุบันใน c เป็น str[j] ใช้ค่าจำนวนเต็มโดย temp=c-’a’
-
อัปเดตความถี่โดย vec[ชั่วคราว]++
-
เพิ่มจำนวนที่สอดคล้องกับเวกเตอร์ความถี่นี้โดยใช้ mp_vec[vec]++
-
ตอนนี้สำรวจแผนที่ที่มีเวกเตอร์ความถี่ทั้งหมดและจำนวนสตริงย่อยรวมโดยใช้ลูปจาก iterator it=mp_vec.begin() ถึงมัน !=mp_vec.end()
-
สำหรับแต่ละอันนับเป็น it->วินาที ให้เพิ่ม ((last) * (last-1))/2 เพื่อนับสำหรับแอนนาแกรมทุกคู่
-
ในตอนท้ายเราจะนับแอนนาแกรมทั้งหมด
-
ผลตอบแทนนับเป็นผลลัพธ์
ตัวอย่าง
#include <bits/stdc++.h> using namespace std; #define MAX 26 int anagram_substring(string str, int length){ int count = 0; map<vector<int>, int> mp_vec; for (int i=0; i<length; i++){ vector<int> vec(MAX, 0); for (int j=i; j<length; j++){ char c = str[j]; char temp = c - 'a'; vec[temp]++; mp_vec[vec]++; } } for (auto it = mp_vec.begin(); it != mp_vec.end(); it++){ int last = it->second; count += ((last) * (last-1))/2; } return count; } int main(){ string str = "TP"; int length = str.length(); cout<<"Count of total anagram substrings are: "<<anagram_substring(str, length) << endl; return 0; }
ผลลัพธ์
หากเราเรียกใช้โค้ดข้างต้น มันจะสร้างผลลัพธ์ต่อไปนี้ -
Count of total anagram substrings are: 3