สมมติว่าเรามีสตริง s และเรามีรายการอื่นที่มีคำไม่กี่คำ คำเหล่านี้มีความยาวเท่ากัน เราต้องหาดัชนีเริ่มต้นของสตริงย่อยใน s ที่ต่อกันในแต่ละคำในคำเพียงครั้งเดียวและไม่มีอักขระใดมาขวาง
ดังนั้นหากอินพุตเป็นเหมือน “wordgoodgoodgoodword” และคำเป็น ["word","good"] ผลลัพธ์จะเป็น [0,12] เนื่องจากสตริงย่อยที่เริ่มต้นที่ดัชนี 0 และ 12 คือ “wordgood” และ “goodword”
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดวิธีการที่เรียกว่า ok() ซึ่งจะใช้สตริง s, แมป wordCnt และ n -
-
ทำสำเนาของ s เป็น temp
-
สำหรับฉันอยู่ในช่วง n ถึงขนาดของ s – 1
-
ถ้าขนาดของอุณหภูมิหลายเท่าของ 0 แล้ว
-
หากเมื่อไม่มี temp ใน wordCnt ให้คืนค่าเท็จ
-
อย่างอื่น
-
ถ้า wordCnt[temp] เป็น 1 ให้ลบ temp ออกจาก wordCnt ให้ตั้งค่า temp เป็นสตริงว่าง
-
หรือลดค่าของ wordCnt[temp] ลง 1 ตั้งค่า temp เป็นสตริงว่าง
-
-
-
เพิ่มอุณหภูมิโดย s[i]
-
-
หาก temp ไม่ได้อยู่ใน wordCnt ให้คืนค่าเท็จ
-
อย่างอื่น
-
ถ้า wordCnt[temp] เป็น 1 ให้ลบ temp ออกจาก wordCnt ให้ตั้งค่า temp เป็นสตริงว่าง
-
หรือลดค่าของ wordCnt[temp] ลง 1 ตั้งค่า temp เป็นสตริงว่าง
-
-
คืนค่าจริงเมื่อขนาดของ wordCnt เป็น 0
-
จากวิธีหลัก ทำสิ่งนี้
-
ถ้าขนาดของ a เป็น 0 หรือขนาดของ b เป็น 0 ให้คืนค่าอาร์เรย์ว่าง
-
ทำแผนที่ wordCnt เก็บความถี่ของสตริงที่มีอยู่ใน b เป็น wordCnt
-
สร้างอาร์เรย์ที่เรียกว่า ans
-
window :=จำนวนคำ x จำนวนตัวอักษรในแต่ละคำ
-
สร้างสำเนาของสตริง a เป็น temp
-
สำหรับฉันในหน้าต่างช่วงขนาด – 1
-
ถ้าขนาด temp ถูกหารด้วยหน้าต่างและเรียก ok(temp, wordCnt, size of b[0]) แล้ว
-
ใส่ i – window เข้าไปใน ans
-
-
ใส่ a[i] ลงใน temp
-
ถ้าขนาดของ temp> window ให้ลบ substring จาก 0, 1
-
-
ถ้าขนาด temp ถูกหารด้วยหน้าต่างและเรียก ok(temp, wordCnt, size of b[0]) แล้ว
-
แทรกขนาดของหน้าต่าง a ลงใน ans
-
-
กลับมาอีกครั้ง
ตัวอย่าง (C++)
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <bits/stdc++.h> using namespace std; void print_vector(vector<auto> v){ cout << "["; for(int i = 0; i<v.size(); i++){ cout << v[i] << ", "; } cout << "]"<<endl; } class Solution { public: bool ok(string s, unordered_map <string, int> wordCnt, int n){ string temp = ""; for(int i = 0; i < n; i++){ temp += s[i]; } for(int i = n; i < s.size(); i++){ if(temp.size() % n == 0){ if(wordCnt.find(temp) == wordCnt.end())return false; else{ if(wordCnt[temp] == 1){ wordCnt.erase(temp); temp = ""; } else { wordCnt[temp]--; temp = ""; } } } temp += s[i]; } if(wordCnt.find(temp) == wordCnt.end())return false; else{ if(wordCnt[temp] == 1){ wordCnt.erase(temp); temp = ""; } else { wordCnt[temp]--; temp = ""; } } return wordCnt.size() == 0; } vector<int>findSubstring(string a, vector<string> &b) { if(a.size() == 0 || b.size() == 0)return {}; unordered_map <string, int> wordCnt; for(int i = 0; i < b.size(); i++)wordCnt[b[i]]++; vector <int> ans; int window = b.size() * b[0].size(); string temp =""; for(int i = 0; i < window; i++)temp += a[i]; for(int i = window; i < a.size(); i++){ if(temp.size() % window == 0 && ok(temp, wordCnt, b[0].size())){ ans.push_back(i - window); } temp += a[i]; if(temp.size() > window)temp.erase(0, 1); } if(temp .size() % window ==0 && ok(temp, wordCnt, b[0].size()))ans.push_back(a.size() - window); return ans; } }; main(){ vector<string> v = {"word","good"}; Solution ob; print_vector(ob.findSubstring("wordgoodgoodgoodword", v)); }
อินพุต
“wordgoodgoodgoodword”, {"word","good"}
ผลลัพธ์
[0, 12, ]