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

C++에서 두 사전 단어의 연결을 사용한 단어 형성

<시간/>

이 문제에서는 사전과 단어가 제공됩니다. 우리의 임무는 두 사전 단어의 연결을 사용하여 주어진 wors를 형성할 수 있는지 확인하는 것입니다.

주어진 단어를 형성하는 동안 단어의 반복은 불법입니다.

문제를 이해하기 위해 예를 들어보겠습니다.

입력

dictionary ={"hello", "tutorials", "program" , "problem", "coding", "point"} 단어 ="tutorialspoint"

출력

<예>예

설명

tutorialspoint는 tutorials와 point를 사용하여 생성됩니다.

이 문제를 해결하기 위해 사전의 모든 요소를 ​​일반적으로 trie라고 하는 접두사 트리에 저장합니다. 그런 다음 trie에서 단어의 접두사를 검색하고 발견되면 두 개로 나누고 단어의 다른 부분을 검색합니다. 찾으면 true else false를 반환합니다.

솔루션 구현을 보여주는 프로그램,

#include네임스페이스 std 사용;#define char_int(c) ((int)c - (int)'a')#define SIZE (26)struct TrieNode{ TrieNode *children[26]; bool isLeaf;};TrieNode *getNode(){ TrieNode * newNode =새로운 TrieNode; newNode->isLeaf =거짓; for (int i =0; i<26; i++) newNode->children[i] =NULL; return newNode;}void insert(TrieNode *루트, 문자열 키){ int n =Key.length(); TrieNode * pCrawl =루트; for (int i=0; ichildren[index] ==NULL) pCrawl->children[index] =getNode(); pCrawl =pCrawl->어린이[색인]; } pCrawl->isLeaf =true;}int prefixSearch(구조 TrieNode *루트, 문자열 키){ int pos =-1, 수준; 구조체 TrieNode *pCrawl =루트; for (레벨 =0; 레벨 isLeaf ==true) pos =수준; if (!pCrawl->children[index]) return pos; pCrawl =pCrawl->어린이[색인]; } if (pCrawl !=NULL &&pCrawl->isLeaf) return level;}bool isWordCreated(struct TrieNode* root, string word){ int len ​​=prefixSearch(root, word); if (len ==-1) false를 반환합니다. string split_word(단어, len, word.length()-(len)); int split_len =prefixSearch(루트, split_word); return (len + split_len ==word.length());}int main() { vector 사전 ={"자습서", "프로그램", "해결", "점"}; 문자열 단어 ="튜토리얼 포인트"; TrieNode *루트 =getNode(); for (int i=0; i 

출력

사전을 이용한 단어 형성 가능