मान लीजिए कि हमारे पास एक स्ट्रिंग s और स्ट्रिंग्स की एक सूची है जिसे dict कहा जाता है, हमें उस dict में मौजूद सबस्ट्रिंग को s में लपेटने के लिए बोल्ड टैग और की एक बंद जोड़ी जोड़नी होगी। जब दो ऐसे सबस्ट्रिंग ओवरलैप होते हैं, तो हमें उन्हें केवल एक जोड़ी बंद बोल्ड टैग से लपेटना होगा। साथ ही, यदि बोल्ड टैग द्वारा लिपटे दो सबस्ट्रिंग लगातार हैं, तो हमें उन्हें संयोजित करने की आवश्यकता है।
इसलिए, यदि इनपुट s ="abcxyz123" जैसा है, तो dict ["abc",,"123"] है, तो आउटपुट "abcxyz123"होगा। पी>
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
-
n :=s का आकार
-
n आकार के बोल्ड ऐरे को परिभाषित करें
-
रिट:=खाली स्ट्रिंग
-
प्रारंभ करने के लिए मैं:=0, अंत:=0, जब मैं
-
इनिशियलाइज़ j :=0 के लिए, जब j
-
यदि इंडेक्स से s का सबस्ट्रिंग (i से dict[j] - 1 के आकार में) dict[j] के समान है, तो -
-
अंत:=अधिकतम अंत और i + dict का आकार [j]
-
-
-
बोल्ड [i] :=अंत> i
-
-
इनिशियलाइज़ करने के लिए i:=0, जब i
. करें-
अगर बोल्ड [i] शून्य है, तो -
-
रिट:=रिट + एस[i]
-
जे:=मैं + 1
-
निम्नलिखित भाग पर ध्यान न दें, अगले पुनरावृत्ति पर जाएं
-
-
जे:=मैं
-
जबकि (j <आकार का s और बोल्ड [j] गैर-शून्य है), करें -
-
(जम्मू को 1 से बढ़ाएं)
-
-
रिट:=इंडेक्स i से j - i - 1 तक रिट का सबस्ट्रिंग "" कॉन्टेनेट s
-
-
वापसी रिट
उदाहरण
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
#include <bits/stdc++.h> using namespace std; class Solution { public: string addBoldTag(string s, vector<string>& dict) { int n = s.size(); vector<int> bold(n); string ret = ""; for (int i = 0, end = 0; i < s.size(); i++) { for (int j = 0; j < dict.size(); j++) { if (s.substr(i, dict[j].size()) == dict[j]) { end = max(end, i + (int)dict[j].size()); } } bold[i] = end > i; } int j; for (int i = 0; i < s.size(); i = j) { if (!bold[i]) { ret += s[i]; j = i + 1; continue; } j = i; while (j < s.size() && bold[j]) j++; ret += "<b>" + s.substr(i, j - i) + "</b>"; } return ret; } }; main(){ Solution ob; vector<string> v = {"abc","123"}; cout << (ob.addBoldTag("abcxyz123", v)); }
इनपुट
"abcxyz123", ["abc","123"]
आउटपुट
<b>abc</b>xyz<b>123</b>