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

C++의 연결된 단어

<시간/>

단어 목록이 있다고 가정합니다. 이 단어들은 구별됩니다. 주어진 단어 목록에서 연결된 모든 단어를 찾는 알고리즘을 고안해야 합니다. 연결된 단어는 실제로 주어진 배열에서 적어도 두 개의 더 짧은 단어로 완전히 구성된 문자열입니다.

따라서 단어가 ["cow", "cows", "cowsgoatcows", "goat", "goatcowsgoat", "hippopotamuses", "deer", "deercowgoatcow"]와 같으면 출력은 ["cowsgoatcows", "염소염소", "사슴소염소"]

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • isPresent() 함수를 정의하면 str, head, idx, 배열 dp가 필요합니다.
  • idx>=str의 크기이면 -
    • 참을 반환
  • dp[idx]가 -1과 같지 않으면 -
    • dp[idx]를 반환
  • 노드 생성 curr :=head
  • 예:=거짓
  • 초기화 i :=idx의 경우, i
  • x :=str[i]
  • curr의 자식[x]가 아니면 -
    • 루프에서 빠져나오기
  • 그렇지 않으면
    • curr :=curr의 자식[x]
  • curr의 isEnd가 참이면 -
    • ok :=ok OR isPresent(str, head, i + 1, dp)
  • dp[idx]를 반환:=확인
  • insertNode() 함수를 정의하면 head, s,
  • 노드 생성 curr =head
  • 초기화 i의 경우:=0, i
  • x :=s[i]
  • curr의 자식[x]가 아니면 -
    • curr의 자식[x] :=새 노드 생성
  • curr :=curr의 자식[x]
  • isEnd of curr :=true
  • 메인 방법에서 다음을 수행하십시오. -
  • head :=새 노드 생성
  • 단어 길이에 따라 배열 단어 정렬
  • ret 배열 정의
  • 초기화 i의 경우:=0, i <단어 크기일 때 업데이트(i를 1만큼 증가), 수행 -
    • curr :=단어[i]
    • curr이 ""와 같으면 -
      • 다음 부분은 무시하고 다음 반복으로 건너뜁니다.
    • 같은 크기의 curr 배열 dp를 정의하고 -1로 채웁니다.
    • isPresent(curr, head, 0, dp) 함수 호출이 0이 아닌 경우 -
      • ret 끝에 curr 삽입
    • 그렇지 않으면
      • insertNode(head, curr) 함수 호출
  • 반환
  • 이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

    #include <bits/stdc++.h>
    using namespace std;
    void print_vector(vector<auto> v){
       cout << "[";
       for(int i = 0; i<v.size(); i++){
          cout << v[i] << ", ";
       }
       cout << "]"<<endl;
    }
    struct Node{
       bool isEnd;
       map <char, Node*> child;
       Node(){
          isEnd = false;
       }
    };
    class Solution {
    public:
       bool isPresent(string str, Node* head, int idx, vector <int>& dp){
          if(idx >= str.size())return true;
          if(dp[idx] != -1)return dp[idx];
          Node* curr = head;
          bool ok = false;
          for(int i = idx; i < str.size(); i++){
             char x = str[i];
             if(!curr->child[x]){
                break;
             }else{
                curr = curr->child[x];
             }
             if(curr->isEnd){
                ok |= isPresent(str, head, i + 1, dp);
             }
          }
          return dp[idx] = ok;
       }
       static bool cmp(string s1, string s2){
          return s1.size() < s2.size();
       }
       void insertNode(Node* head, string s){
          Node* curr = head;
          for(int i = 0; i < s.size(); i++){
             char x = s[i];
             if(!curr->child[x]){
                curr->child[x] = new Node();
             }
             curr = curr->child[x];
          }
          curr->isEnd = true;
       }
       vector<string> findAllConcatenatedWordsInADict(vector<string>& words) {
          Node* head = new Node();
          sort(words.begin(), words.end(), cmp);
          vector <string> ret;
          for(int i = 0; i < words.size(); i++){
             string curr = words[i];
             if(curr=="")continue;
             vector <int> dp(curr.size(), -1);
             if(isPresent(curr, head, 0, dp)){
                ret.push_back(curr);
             }else{
                insertNode(head, curr);
             }
          }
          return ret;
       }
    };
    main(){
       Solution ob;
       vector<string> v =    {"cow","cows","cowsgoatcows","goat","goatcowsgoat","hippopotamuses","deer","deercowgoatcow"};
       print_vector(ob.findAllConcatenatedWordsInADict(v));
    }

    입력

    {"cow","cows","cowsgoatcows","goat","goatcowsgoat","hippopotamuses","deer","deercowgoatcow"}

    출력

    [cowsgoatcows, goatcowsgoat, deercowgoatcow, ]