본문 바로가기

Algorithm/String

(C++) - LeetCode (easy) 290. Word Pattern

반응형

https://leetcode.com/problems/word-pattern/description/

 

Word Pattern - LeetCode

Word Pattern - Given a pattern and a string s, find if s follows the same pattern. Here follow means a full match, such that there is a bijection between a letter in pattern and a non-empty word in s.   Example 1: Input: pattern = "abba", s = "dog cat ca

leetcode.com

자료구조 문제였습니다.

📕 풀이방법

📔 입력 및 초기화

1. c++은 split함수가 없으므로 만들어줍니다. 공백으로 구분해 split해주고 vector <string> v를 선언해 결과값을 저장합니다.2. map을 두 개 선언 후 v의 원소들을 순회하며 map m에는 {문자열, pattern}, map m2에는 {pattern, 문자열}로 저장해줍니다. 이때 기존에 이미 저장된 pattern이라면 건너뛰어 줍니다.3. 다시 v의 원소들을 순회하며 현재 문자열의 pattern이 나와야하는 pattern과 일치여부를 판별합니다.* s와 pattern의 크기가 1보다크며 같은것은 false입니다. 공백으로 split한 문자열 개수와 pattern크기가 달라도 false입니다.

📔 정답 출력 | 반환

일치하면 true 아니라면 false를 반환합니다.


📕 Code

📔 C++

class Solution {
public:
    vector <string> split(string input, char delimiter){
        vector <string> result;
        stringstream ss(input);
        string tmp;
        while(getline(ss,tmp,delimiter)) result.push_back(tmp);
        return result;
    }

    bool wordPattern(string pattern, string s) {
        if(pattern == s && s.size() > 1) return false;
        vector <string> v = split(s, ' ');
        if(pattern.size() != v.size()) return false;
        map<string, char> m;
        map<char, string> m2;
        for(int i = 0; i < v.size(); i++) {
            if(m2.count(pattern[i])) continue;
            m[v[i]] = pattern[i];
            m2[pattern[i]] = v[i];
        }
        for(int i = 0; i < v.size(); i++) {
            if(m[v[i]] != pattern[i]) {
                return false;
            }
        }
        return true;
    }
};

*더 나은 내용을 위한 지적, 조언은 언제나 환영합니다.