문자열 s와 dict라는 문자열 목록이 있다고 가정하고 해당 dict에 있는 s의 하위 문자열을 래핑하기 위해 굵은 굵은 태그 및 의 닫힌 쌍을 추가해야 합니다. 두 개의 하위 문자열이 겹칠 때 닫힌 볼드 태그 한 쌍으로만 함께 포장해야 합니다. 또한 굵은 태그로 묶인 두 개의 하위 문자열이 연속적이면 결합해야 합니다.
따라서 입력이 s ="abcxyz123" dict is ["abc","123"]인 경우 출력은 "abcxyz123"피>
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
n :=s
의 크기 -
n 크기의 굵게 배열 정의
-
ret :=빈 문자열
-
for initialize i :=0, end :=0, i
-
j 초기화의 경우:=0, j
-
인덱스(i에서 dict[j]의 크기 - 1까지)의 s 부분 문자열이 dict[j]와 같으면 -
-
end :=end의 최대값과 i + dict[j]의 크기
-
-
-
굵게[i] :=끝> i
-
-
for initialize i :=0, i
-
굵게[i]가 0이면 -
-
렛 :=렛 + s[i]
-
j :=i + 1
-
다음 부분은 무시하고 다음 반복으로 건너뜁니다.
-
-
j :=나는
-
동안 (j
-
(j를 1씩 증가)
-
-
ret :=인덱스 i에서 j까지 ret의 부분 문자열 - 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>