이름
단어리스트로부터,이리스트는 문자열 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;
}
};