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

C++에서 단어의 짧은 인코딩

<시간/>

단어 목록이 있다고 가정하고 참조 문자열 S와 색인 목록 A를 작성하여 인코딩할 수 있습니다. 예를 들어 단어 목록이 ["time", "me", "bell" ], S ="time#bell#" 및 인덱스 =[0, 2, 5]로 쓸 수 있습니다. 여기에서 각 인덱스에 대해 "#" 기호에 도달할 때까지 해당 인덱스의 참조 문자열에서 읽어 단어를 복구합니다.

따라서 주어진 단어를 인코딩하는 가능한 가장 짧은 참조 문자열 S의 길이를 찾아야 합니다. 따라서 주어진 예에서 출력은 10이 됩니다.

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • insertNode 메서드를 정의합니다. 이 메서드는 헤드와 문자열을 사용합니다.
  • curr :=head, flag :=false.
  • i의 경우 s – 1부터 0까지 크기 범위
    • x :=s[i]
    • curr의 m[x]가 null이면 flat :=true로 설정하고 curr의 m[x]에 새 노드를 만듭니다.
    • curr :=m[x] of curr
  • 플래그가 true이면 s의 크기를 반환하고 그렇지 않으면 0
  • 메인 방법에서 다음을 수행하십시오. -
  • ret :=0, head :=새 노드
  • 길이에 따라 단어 배열 정렬
  • n :=단어 크기
  • 0 ~ n – 1 범위의 i에 대해
    • temp :=insertNode(head, words[i])
    • temp가 0이 아니면 ret :=ret + temp + 1
  • 반환

이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

예시

#include <bits/stdc++.h>
using namespace std;
struct Node{
   map <char, Node*> m;
};
class Solution {
   public:
   static bool cmp(string a, string b){
      return a.size() > b.size();
   }
   int insertNode(Node* head, string s){
      Node* curr = head;
      bool flag = false;
      for(int i = s.size() - 1; i >= 0; i--){
         char x = s[i];
         if(!curr->m[x]){
            flag = true;
            curr->m[x] = new Node();
         }
         curr = curr->m[x];
      }
      return flag? (int)s.size() : 0;
   }
   int minimumLengthEncoding(vector<string>& words) {
      int ret = 0;
      Node* head = new Node();
      sort(words.begin(), words.end(), cmp);
      int n = words.size();
      for(int i = 0; i < n; i++){
         int temp= insertNode(head, words[i]);
         if(temp){
            ret += (temp + 1);
         }
      }
      return ret;
   }
};
main(){
   vector<string> v = {"time", "me", "bell"};
   Solution ob;
   cout << (ob.minimumLengthEncoding(v));
}

입력

["time", "me", "bell"]

출력

10