Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 문자열에 굵은 태그 추가

<시간/>

문자열 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>