LeetCode_접속사

11727 단어 LetCode 문제 풀이
중복된 단어가 없는 목록을 정하고, 프로그램을 작성하여, 주어진 단어 목록의 모든 연결어를 되돌려줍니다.
연결어의 정의는 다음과 같다. 하나의 문자열은 최소한 두 개의 주어진 그룹의 단어로 구성되어 있다.
예:
입력: ["cat", "cats", "catsdogcats", "dog", "dogcatsdog", "hippopotamuses", "rat", "ratcatdogcat"]
출력: ["catsdogcats", "dogcatsdog", "ratcatdogcat"]
설명: "catsdogcats는"cats","dog","cats"로 구성됩니다.'dogcatsdog'는'dog','cats'와'dog'로 구성된다."ratcatdogcat"은 "rat", "cat", "dog"과 "cat"로 구성되어 있습니다.설명:
주어진 그룹의 원소 총수는 10000을 넘지 않는다.주어진 그룹의 원소의 길이는 총 600000을 넘지 않습니다.모든 입력 문자열은 소문자만 포함합니다.답안 출력의 순서를 고려할 필요가 없다.
출처: 리코더 링크:https://leetcode-cn.com/problems/concatenated-words저작권은 인터넷 소유에 귀속된다.상업 전재는 관공서에 연락하여 권한을 수여하고 비상업 전재는 출처를 밝혀 주십시오.
접두사 트리
class Solution {

    class TreeNode{
        TreeNode[] list = new TreeNode[26];
        boolean isEnd = false;
    }

    public void insert(TreeNode root,String[] words){
        for(String word : words){
            if(word==null || word.equals("")) continue;
            TreeNode temp = root;
            char[] array = word.toCharArray();
            for(int i=0;i<array.length;i++){
                int index = array[i]-'a';
                if(temp.list[index]==null){
                    TreeNode tp = new TreeNode();
                    temp.list[index] = tp;
                }
                temp = temp.list[index];
            }
            temp.isEnd = true;
        }
    }

    public boolean seach(TreeNode root, String word, int count, int index){
        TreeNode temp = root;
        for(int i=index;i<word.length();i++){
            int pos = word.charAt(i) - 'a';
            if(temp.list[pos] == null)
                return false;
            temp = temp.list[pos];
            if(temp.isEnd && seach(root, word, count+1, i+1))
                return true;
        }
        return count>0 && temp.isEnd;
    }

    public List<String> findAllConcatenatedWordsInADict(String[] words) {
        List<String> list = new ArrayList<String>();
        TreeNode root = new TreeNode();
        insert(root,words);
        for(String word : words){
            if(seach(root,word,0,0)){
                list.add(word);
            }      
        }
        return list;
    }
}

좋은 웹페이지 즐겨찾기