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

Repeated Substring Pattern ใน C++

สมมติเรามี non-empty string เราต้องตรวจสอบว่าสามารถสร้างได้โดยการนำ substring มา append หลายครั้งหรือไม่ สตริงประกอบด้วยตัวอักษรภาษาอังกฤษพิมพ์เล็กเท่านั้น และความยาวไม่เกิน 10000 เช่นถ้า input คือ "abaabaaba" คำตอบคือ true เพราะสร้างจาก "aba"

เพื่อแก้ปัญหานี้ เราจะใช้ dynamic programming approach

  • กำหนด array DP ขนาด n โดย n คือขนาดสตริง
  • i := 1 และ j := 0
  • while i < n:
    • ถ้า 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 แล้ว return true
  • มิฉะนั้น return false

โปรแกรมตัวอย่าง

#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" : "false";
    cout << res;
}

Input

"abaabaaba"

Output

true