日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Leetcode290单词规律-map使用

發(fā)布時(shí)間:2025/4/5 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Leetcode290单词规律-map使用 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目

給定一種規(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。