ในปัญหานี้ เราได้รับสตริง str และ pow จำนวนเต็ม งานของเราคือ ค้นหาสตริงย่อยที่มีพลังที่กำหนด .
เราจำเป็นต้องส่งคืนสตริงย่อยที่มีกำลังเท่ากับ pow
พลังของสตริง คือผลรวมของพลังของตัวละคร
พลังของตัวละคร :a -> 1, b -> 2, c -> 3,...
มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน
Input : string = "programming" power = 49 Output : 'pro'
คำอธิบาย −
Power of matrix : pro, power(p) = 16 power(p) = 18 power(p) = 15 Total = 16 + 18 + 15 = 49
แนวทางการแก้ปัญหา
วิธีแก้ปัญหาอย่างง่ายคือการใช้การวนซ้ำซ้อน เราจะวนลูปผ่านสตริงและใช้วงใน เราจะพบสตริงย่อย สำหรับแต่ละสตริงย่อย เราจะคำนวณกำลัง จากนั้นตรวจสอบว่ามีค่าเท่ากับ 'pow' ให้คืนค่า จริง หากใช่ มิฉะนั้น ให้คืนค่าเท็จ
วิธีที่มีประสิทธิภาพในการแก้ปัญหาคือการใช้แผนที่เพื่อเก็บพลังงาน เราจะคำนวณพลังของสตริงย่อยและจัดเก็บไว้ในแผนที่ ตรวจสอบว่ามีค่าอยู่ในแผนที่ที่สามารถทำให้พลังเท่ากับพลังงานที่ต้องการหรือไม่ ถ้าใช่ ให้คืนค่า จริง . ส่งกลับ เท็จ เมื่ออักขระทั้งหมดของสตริงถูกข้ามไปและไม่พบค่าพลังที่ตรงกัน
อัลกอริทึม
-
ขั้นตอนที่ 1 − ข้ามเชือกและหากำลัง (currPow)
-
ขั้นตอนที่ 2 − หากมีค่า (currPow - pow) อยู่ในแผนที่หรือไม่
-
ขั้นตอนที่ 2.1 − ถ้าใช่ พิมพ์ -> สตริงย่อย
-
-
ขั้นตอนที่ 3 − ใส่ค่าของ currPow ลงในแผนที่
-
ขั้นตอนที่ 4 − หากข้ามอักขระทั้งหมดของสตริง ให้พิมพ์ -> 'ไม่สามารถทำได้'
ตัวอย่าง
โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา
#include <bits/stdc++.h>
using namespace std;
void findSubStringWithPower(string str, int power) {
int i;
unordered_map<int , int > powerSS;
int currPower = 0;
int N = str.length();
for (i = 0; i < N; i++) {
currPower = currPower + (str[i] - 'a' + 1);
if (currPower == power) {
cout<<"Substring : "<<str.substr((0), i+1)<<" has power "<<power;
return;
}
if (powerSS.find(currPower - power) != powerSS.end()) {
cout<<"Substring from index "<<str.substr((powerSS[currPower-power] + 1),(i - (powerSS[currPower - power] + 1)) + 1);
cout<<" has power "<<power; return;
}
powerSS[currPower] = i;
}
cout<<"No substring found!";
}
int main() {
string str = "programming";
int power = 49;
findSubStringWithPower(str, power);
return 0;
} ผลลัพธ์
Substring : pro has power 49