LeetCode [820] 부호화 압축 단어

이름

단어리스트로부터,이리스트는 문자열 S 인덱스와 인덱스리스트 A.로 인코딩 될
예를 들어,리스트가있는 경우 [ "시간", "나" , "종", 우리는 S = "# 시간 벨 #"과 인덱스 = 0, 2, 5와 같이 표현 될 수있다 ].
각 인덱스를 들어, 우리는 단어의 이전 목록을 복원하려면 "#"이 끝날 때까지 위치에있는 문자열 S에서 문자열 인덱스를 읽어 시작할 수 있습니다.
그런 다음 인코딩 주어진 단어 목록의 성공에 문자열의 최소 길이는 얼마입니까?

예 :

输入: words = ["time", "me", "bell"]
输出: 10
说明: S = "time#bell#" , indexes = [0, 2, 5] 。

팁 :

  • 1 <= words.length <= 2,000
  • 1 <= 단어 [I] .length <= 7
  • 각 단어는 소문자입니다.

A는 생각 : 저장 접미사

세트에있는 경우가 제거되면 접미사를 통과하는 각 단어에 대한 세트의 세트에서 모든 단어, 다음 트래버스 IME, 나, 전자, 나를 삭제, 같은 시간으로, 볼 수 있습니다. 이 보장하지만 더 이상 합병에 남아 있지 수있는 단어의 집합 플러스 최종 세트는 각 단어 및 #의 길이를 통과 할 수있다.

코드

시간 복잡도 : O ($ \ 합 W_ { I} ^ 2 $), $ W_ {I} $ 단어 [I]의 길이이며, 각각의 워드는 $ W_ {I} $ 접미사 검색어 여부를 갖고 해시 값 요구가 O ($ W_ {I} $ 설정한다 ) 를 산출한다.
공간 복잡도 : O ($ \ 합 W_ { I} $), 단어 저장 공간 오버 헤드.

class Solution {
public:
    int minimumLengthEncoding(vector<string>& words) {
        int res = 0;
        unordered_set<string> ust(words.begin(), words.end());
        for (string word : ust) {
            for (int i = 1; i < word.size(); ++i) {
                ust.erase(word.substr(i));
            }            
        }
        for (string word : ust) {
            res += word.size() + 1;
        }
        return res;
    }
};

추천

출처www.cnblogs.com/galaxy-hao/p/12590041.html