Leetcode290单词规律-map使用
題目
給定一種規(guī)律 pattern 和一個(gè)字符串 str ,判斷 str 是否遵循相同的規(guī)律。 這里的 遵循 指完全匹配,例如, pattern 里的每個(gè)字母和字符串 str 中的每個(gè)非空單詞之間存在著雙向連接的對(duì)應(yīng)規(guī)律。
示例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
說明:
你可以假設(shè) pattern 只包含小寫字母, str 包含了由單個(gè)空格分隔的小寫字母。
解題思路
使用map數(shù)據(jù)結(jié)構(gòu),對(duì)出現(xiàn)的單詞和對(duì)應(yīng)的字母進(jìn)行映射。
對(duì)于任何一個(gè)單詞,分為兩種情況處理。
第一種情況:如果之前出現(xiàn)過,就要看它已經(jīng)存在的映射字母,是否和現(xiàn)在待判斷的一致。如果一致,則映射還是正確的;如果不一致,說明單詞和模式不匹配。
這種情況的舉例如下:“dog dog cat dog” 和"aabc" 對(duì)于單詞dog,我們看第三個(gè)dog,它已存在的映射字母是a,此時(shí)待判斷的對(duì)應(yīng)字母是c,發(fā)現(xiàn)a ≠c,所以不匹配。
第二種情況:單詞之前沒有出現(xiàn)過。我們要看當(dāng)前的對(duì)應(yīng)字符是否使用過。如果使用過,說明不匹配;如果沒使用過,就進(jìn)行map映射。
詳細(xì)代碼注釋請(qǐng)參閱下面的測(cè)試代碼。
Leetcode代碼
class Solution { public:bool wordPattern(string pattern, string str) {map<string,char> word_letter;char used[128]={0};//已被映射的pattern字符string word;int pos=0;//當(dāng)前指向的pattern字符str.push_back(' ');for(int i=0;i<str.length();i++){//cout<<str[i];if(str[i]==' '){if(word_letter.find(word)==word_letter.end())//沒有形成對(duì)應(yīng) {if(used[pattern[pos]]==1)//卻被標(biāo)記 return false;//當(dāng)前pattern字符已使用word_letter[word]=pattern[pos]; //cout<<word_letter[word]<<endl; used[pattern[pos]]=1;}else{//已經(jīng)映射 if(word_letter[word]!=pattern[pos])//但是和已經(jīng)存在的映射不匹配 return false;// cout<<word_letter[word]<<endl; }word="";pos++;//后移 }else{word+=str[i];}}//for(map<string,char>::iterator it=word_letter.begin();it!=word_letter.end();it++)//cout<<it->first<<" "<<it->second<<endl;if(pos!=pattern.length()) return false;//單詞個(gè)數(shù)和字符個(gè)數(shù)不一致 return true; } };測(cè)試代碼
#include<iostream> #include<string> #include<map>using namespace std;bool wordPattern(string pattern,string str) {map<string,char> word_letter;char used[128]={0};//已被映射的pattern字符string word;//臨時(shí)保存拆分出來(lái)的單詞int pos=0;//當(dāng)前指向的pattern字符 str.push_back(' ');//單詞最后加一個(gè)空格,便于處理//遍歷單詞strfor(int i=0;i<str.length();i++){//如果是空格,則知道前面是單詞if(str[i]==' '){if(word_letter.find(word)==word_letter.end())//沒有形成對(duì)應(yīng) {if(used[pattern[pos]]==1)//卻被標(biāo)記 return false;//當(dāng)前pattern字符已使用word_letter[word]=pattern[pos]; //形成映射//cout<<word_letter[word]<<endl; used[pattern[pos]]=1;//字母標(biāo)記為使用過}else{//已經(jīng)映射 if(word_letter[word]!=pattern[pos])//但是和已經(jīng)存在的映射不匹配 return false;// cout<<word_letter[word]<<endl; }word="";//word清空,便于下一次使用pos++;//后移 }//如果是單詞else{word+=str[i];//單詞直接放到word中}} //使用迭代器遍歷map數(shù)據(jù)結(jié)構(gòu) //打印映射的具體內(nèi)容for(map<string,char>::iterator it=word_letter.begin();it!=word_letter.end();it++)cout<<it->first<<" "<<it->second<<endl;if(pos!=pattern.length()) return false;//單詞個(gè)數(shù)和字符個(gè)數(shù)不一致 return true; }int main() {string str="dog dog fish fish cat";string letter="bbaac";if(wordPattern(letter,str))cout<<"matched";else cout<<"not matched"; }測(cè)試用例
string str=“dog dog fish fish cat”;
string letter=“bbaac”;
測(cè)試結(jié)果
題目來(lái)源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/word-pattern
希望對(duì)你有幫助。
總結(jié)
以上是生活随笔為你收集整理的Leetcode290单词规律-map使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在部队残疾有什么补偿
- 下一篇: 解放军空军工程大学在哪