สมมติว่าเรามีสตริงที่ไม่ว่าง เราต้องตรวจสอบว่าสามารถสร้างขึ้นได้หรือไม่โดยใช้สตริงย่อยและต่อท้ายสตริงย่อยหลายครั้ง สตริงประกอบด้วยตัวอักษรภาษาอังกฤษตัวพิมพ์เล็กเท่านั้นและความยาวไม่เกิน 10000 ดังนั้นหากอินพุตเป็นเหมือน “abaabaaba” คำตอบจะเป็นจริง เนื่องจากสร้างขึ้นโดยใช้ “aba”
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- เราจะใช้วิธีการเขียนโปรแกรมแบบไดนามิก
- กำหนดอาร์เรย์ DP ขนาด n n คือขนาดของสตริง
- i :=1 และ j :=0
- ในขณะที่ฉัน
- ถ้า str[i] ==str[j] แล้ว DP[i] :=j + 1 ให้เพิ่ม i และ j ขึ้น 1
- อย่างอื่น
- ถ้า j> 0 แล้ว j :=DP[j – 1]
- อื่น dp[i] :=0 และเพิ่ม i 1
- คืนค่าจริง
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <bits/stdc++.h> using namespace std; class Solution { public: void printVector(vector <int> v){ for(int i = 0; i < v.size(); i++)cout << v[i] << " "; cout << endl; } bool repeatedSubstringPattern(string s) { int n = s.size(); vector <int> dp(n); int i = 1; int j = 0; while(i < n){ if(s[i] == s[j]){ dp[i] = j+1; i++; j++; } else { if(j > 0){ j = dp[j-1]; } else { dp[i] = 0; i++; } } } return dp[n - 1] && n % (n - dp[n-1]) == 0; } }; main(){ Solution ob; string res = (ob.repeatedSubstringPattern("abaabaaba"))? "true" : "fasle"; cout << res; }
อินพุต
"abaabaaba"
ผลลัพธ์
true