1. 程式人生 > 其它 >leetCode290:單詞規律

leetCode290:單詞規律

技術標籤:刷題筆記

目錄

一、題目描述

二、解題思路

三、程式碼實現


一、題目描述

給定一種規律 pattern和一個字串str,判斷 str 是否遵循相同的規律。

這裡的遵循指完全匹配,例如,pattern裡的每個字母和字串str中的每個非空單詞之間存在著雙向連線的對應規律。

示例1:

輸入: pattern = "abba", str = "dog cat cat dog"
輸出: true

示例 2:

輸入:pattern = "abba", str = "dog cat cat fish"
輸出:

false

示例 3:

輸入: pattern = "aaaa", str = "dog cat cat dog"
輸出: false

示例4:

輸入: pattern = "abba", str = "dog dog dog dog"
輸出: false


說明:
你可以假設pattern只包含小寫字母,str包含了由單個空格分隔的小寫字母。

二、解題思路

這道題考察雜湊,但是考察的是對映裡的雙射。之前沒有做過這類題,自己瞎寫搞了好久…

雙射:兩個集合裡的值一一對映。比如題目裡的ch與string單詞的對映,string單詞與ch的對映就是雙射關係。

雖然是簡單題,雙射還是要記錄一下的。

三、程式碼實現

#include <bits/stdc++.h>
using namespace std;

bool wordPattern(string pattern, string s) {
	int length = s.size();
	vector<string> words;
	string tmp = "";
	for (int i = 0; i < length; ++i) {
		if (s[i] != ' ') {
			tmp += s[i];
		}
		if (s[i] == ' ' || i == length - 1) {
			words.push_back(tmp);
			tmp = "";
		}
	}
	if (pattern.size() != words.size())  return false;
	//學習雙射這個概念
	unordered_map<char, string> ch2str;
	unordered_map<string, char> str2ch;
	for (int i = 0; i < pattern.size(); i++) {
		char ch = pattern[i];
		if (ch2str.count(ch) && ch2str[ch] != words[i]) return false;
		if (str2ch.count(words[i]) && str2ch[words[i]] != ch) return false;
		ch2str[ch] = words[i];
		str2ch[words[i]] = ch;
	}
	return true;
}
int main() {
	string pattern = "abc";
	string s = "dog cat dog";
	cout << wordPattern(pattern, s) << " ";
	
	return 0;
}