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

C++의 단어 패턴

<시간/>

패턴과 문자열 str이 있다고 가정하고 str이 동일한 패턴을 따르는지 찾습니다. 다음은 패턴의 문자와 str의 비어 있지 않은 단어 사이에 전단사절이 있음을 의미합니다.

따라서 입력이 pattern ="cbbc", str ="word pattern pattern word"와 같으면 출력은 True가 됩니다.

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

  • strcin :=str

  • 단어 배열 정의

  • strcin의 각 단어에 대해

    • 단어 끝에 단어 삽입

  • 하나의 맵 p2i 정의

  • 나는 :=0

  • pat :=빈 문자열

  • 패턴의 c에 대해 -

    • c가 p2i의 구성원이 아니면 -

      • (i를 1씩 증가)

      • p2i[c] :=i

    • pat :=pat 연결 p2i[c]

  • 하나의 맵 str2i 정의

  • 나는 :=0

  • pat1 :=빈 문자열

  • 단어의 c에 대해 -

    • c가 str2i의 구성원이 아니면 -

      • (i를 1씩 증가)

      • str2i[c] :=i

    • pat1 :=pat1 str2i[c]

      연결
  • pat1이 pat와 같으면 true를 반환

예시

더 나은 이해를 위해 다음 구현을 살펴보겠습니다. −

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   bool wordPattern( string pattern, string str ) {
      istringstream strcin(str);
      string word;
      vector<string> words;
      while (strcin >> word)
         words.push_back(word);
      unordered_map<char, int> p2i;
      int i = 0;
      string pat = "";
      for (auto c : pattern) {
         if (p2i.count(c) == 0) {
            i++;
            p2i[c] = i;
         }
         pat += to_string(p2i[c]);
      }
      unordered_map<string, int> str2i;
      i = 0;
      string pat1 = "";
      for (auto c : words) {
         if (str2i.count(c) == 0) {
            i++;
            str2i[c] = i;
         }
         pat1 += to_string(str2i[c]);
      }
      return pat1 == pat;
   }
};
main(){
   Solution ob;
   cout << (ob.wordPattern("cbbc", "word pattern pattern word"));
}

입력

"cbbc", "word pattern pattern word"

출력

1