ในปัญหานี้ เราได้รับสตริง str จำนวนคิวรีของ Q แต่ละค่าประกอบด้วยสองค่า L และ R สำหรับสตริงย่อย[L...R] หน้าที่ของเราคือสร้างโปรแกรมเพื่อแก้ Queries เพื่อตรวจสอบว่า substring[L…R] เป็น palindrome หรือไม่
คำอธิบายปัญหา − สำหรับการแก้ปัญหาแต่ละคำถาม เราจำเป็นต้องตรวจสอบว่าสตริงย่อยที่สร้างขึ้นภายในช่วง L ถึง R เป็นพาลินโดรมหรือไม่
มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน
อินพุต
str = “abccbeba” , Q = 3 Query[][] = {{1, 4}, {0, 6}, {4, 6}}
ผลลัพธ์
Palindrome Not Palindrome Palindrome
คำอธิบาย
Creating all substring for the given substrings : Substring[1...4] = “bccb”, it is a palindrome Substring[0...6] = “abccbeb”, it is a not palindrome Substring[4...6] = “beb”, it is a palindrome
แนวทางการแก้ปัญหา
วิธีแก้ปัญหาอย่างง่ายคือการแก้ปัญหาแต่ละคำถาม ในการแก้ปัญหานี้ เราจำเป็นต้องค้นหาสตริงย่อยจากช่วงดัชนี L ถึง R และตรวจสอบว่าสตริงย่อยนั้นเป็นพาลินโดรมหรือไม่
โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา
ตัวอย่าง
#include <bits/stdc++.h> using namespace std; int isPallindrome(string str){ int i, length; int flag = 0; length = str.length(); for(i=0;i < length ;i++){ if(str[i] != str[length-i-1]) { flag = 1; break; } } if (flag==1) return 1; return 0; } void solveAllQueries(string str, int Q, int query[][2]){ for(int i = 0; i < Q; i++){ isPallindrome(str.substr(query[i][0] - 1, query[i][1] - 1))?cout<<"Palindrome\n":cout<<"Not palindrome!\n"; } } int main() { string str = "abccbeba"; int Q = 3; int query[Q][2] = {{1, 3}, {2, 5}, {4, 5}}; solveAllQueries(str, Q, query); return 0; }
ผลลัพธ์
Palindrome Not palindrome! Palindrome
นี่เป็นวิธีการที่ไร้เดียงสาแต่ไม่มีประสิทธิภาพ
วิธีแก้ปัญหาที่มีประสิทธิภาพคือการใช้วิธีการเขียนโปรแกรมแบบไดนามิก สำหรับการแก้ปัญหา เราจำเป็นต้องสร้างอาร์เรย์ DP เป็นอาร์เรย์ 2 มิติที่เก็บค่าบูลีนที่ระบุว่าสตริงย่อย[i...j] เป็นพาลินโดรมสำหรับ DP[i][j]
เราจะสร้างเมทริกซ์ DP นี้และตรวจสอบค่า LR ทั้งหมดของแต่ละการสืบค้น
โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา
ตัวอย่าง
#include <bits/stdc++.h> using namespace std; void computeDP(int DP[][50], string str){ int length = str.size(); int i, j; for (i = 0; i < length; i++) { for (j = 0; j < length; j++) DP[i][j] = 0; } for (j = 1; j <= length; j++) { for (i = 0; i <= length - j; i++) { if (j <= 2) { if (str[i] == str[i + j - 1]) DP[i][i + j - 1] = 1; } else if (str[i] == str[i + j - 1]) DP[i][i + j - 1] = DP[i + 1][i + j - 2]; } } } void solveAllQueries(string str, int Q, int query[][2]){ int DP[50][50]; computeDP(DP, str); for(int i = 0; i < Q; i++){ DP[query[i][0] - 1][query[i][1] - 1]?cout<<"not palindrome!\n":cout<<"palindrome!\n"; } } int main() { string str = "abccbeba"; int Q = 3; int query[Q][2] = {{1, 3}, {2, 5}, {4, 5}}; solveAllQueries(str, Q, query); return 0; }
ผลลัพธ์
palindrome! not palindrome! palindrome!