다음 내용은 다음과 같습니다
폴더 목록을 감안할 때, 해당 폴더의 모든 하위 폴더를 제거하고 제거한 후 임의의 순서로 폴더를 반환합니다.
A는 경우
folder[i]
다른 내에 위치하고 있으며folder[j]
, 그것의 하위 폴더라고합니다.경로의 형식은 형식의 하나 이상의 연결된 문자열입니다 :
/
하나 개 이상의 소문자 영문자 하였다. 예를 들어,/leetcode
및/leetcode/problems
빈 문자열 동안 유효한 경로는 다음과/
없습니다.예 1 :
입력 : 폴더 = '/ A ","/ A / B ","/ C / D ","/ C / D / E ","/ C / F "] 출력 :'/ A", "/ C / D ","/ C / F "] 설명 : 폴더"/ A / B / / A "및"/ C / D / E / C / D "에서"폴더 안에 ""의 하위 인 " 우리의 파일 시스템.예 2 :
입력 : 폴더 = '/ A ","/ A / B / C ","/ A / B / D "] 출력 :'/ A"] 설명 : 폴더 "/ A / B / C"및 "/ A / B / D / / A ''가 하위의 때문에 제거 될 것이다. "예 3 :
입력 : 폴더 = "/ A / B / C", "/ A / B / CA ','/ A / B / D"] 출력 [ "/ A / B / C", "/ A / B / CA ','/ A / B / D "]제약 :
1 <= folder.length <= 4 * 10^4
2 <= folder[i].length <= 100
folder[i]
소문자를 포함하고 '/'folder[i]
항상 문자로 시작 '/'- 각 폴더 이름은 고유합니다.
문제 해결 아이디어 : 첫째, 사전 트리, 긴 분류에 단기의 요소에 의해 해당 폴더를 연 다음 폴더를 통과, 이미 사전 트리 요소에 접두사 일치 해. 폴더 [내가] 삭제 하위 디렉토리, 기타를 보여주는 사전 트리에있는 경우; 넣어하지 않을 경우 디렉토리 트리가 사전에 삽입됩니다.
다음과 같이 코드입니다 :
클래스 의 TreeNode (객체) : 데프 __init__ (자기, 배) : self.val = X self.childDir = {} self.isDir = 거짓 클래스 트리는 (객체) : DIC = {} 데프 __init__ (자기) : "" " 초기화 여기에 데이터 구조. "" " self.root = TreeNode를 (없음) self.dic = {} 데프 삽입 (자기, 워드) : 노드 = self.root 에 대한 전의 한마디 경우 나 하지 의 node.childDir : node.childDir [I]는 = TreeNode를 (ⅰ) 노드 = node.childDir [I] node.isDir = 참 DEF isDelete (자기, DIR) 노드 = self.root 위한 I 의 DIR : 만약 I 에서 node.childDir : 노드 = node.childDir [I] 의 경우 node.isDir == true를 반환사실 다른 사람 : 반환 False를 반환 거짓 클래스 : 솔루션 (객체) 데프 removeSubfolders (자기, 폴더) : "" " : 유형 폴더 :리스트 [STR] : RTYPE : 목록 [STR] " "" folder.sort (CMP = 람다 1 개 , X2 : LEN (X1) - LEN (X2)) 트라이 = 트리는 () 입술 = [] 에 대한 F 의 폴더 : 만약 trie.isDelete (F) == 거짓 : res.append (F) trie.insert (F +' / ' ) 복귀 입술