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

รูปแบบสตริงย่อยซ้ำใน C++


สมมติว่าเรามีสตริงที่ไม่ว่าง เราต้องตรวจสอบว่าสามารถสร้างขึ้นได้หรือไม่โดยใช้สตริงย่อยและต่อท้ายสตริงย่อยหลายครั้ง สตริงประกอบด้วยตัวอักษรภาษาอังกฤษตัวพิมพ์เล็กเท่านั้นและความยาวไม่เกิน 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
  • ถ้า DP[n – 1] ไม่ใช่ 0 และ n % (n – DP[n – 1]) ==0
    • คืนค่าจริง
  • มิฉะนั้นคืนค่าเท็จ
  • ตัวอย่าง

    ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

    #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