LeetCode 290. 单词规律(C++)

it2022-05-09  19

题目描述:

给定一种规律 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

解题思路:

1.设置字符串到pattern 字符的映射(哈希)使用数组used[128]记录pattern字符是否使用

2,遍历str按照空格拆分单词,同时对应用的向前移动指向pattern字符的指针,没拆分出一个单词,判断:

如果该单词从未出现在哈希表中:

              如果当前的pattern字符已经被使用,则返回false;

              将单词与当前的pattern字符做映射;

              标记当前指向的pattern字符已经被使用

否则:

              如果当前的单词在哈希表中的映射字符不是当前指定的pattern字符,那么返回false。

3.若单词的个数与pattern的字符个数不匹配,返回false。

代码实现:

class Solution { public: bool wordPattern(string pattern, string str) { map<string,char> word_map; //单词到pattern的映射 char used[128]={0}; //已经被映射的pattern字符 string word=""; //临时保存拆分出的单词 int pos=0; //当前指向的pattern字符 str.push_back(' '); //str尾部push一个空格,是遇到空格就拆分字符。 for(int i=0;i<str.length();i++){ if(str[i]==' '){ //遇到空格,就拆出字符 if(pos==pattern.length()){ //如果已经拆出单词,但是已经没有pattern可以进行对应了 return false; } if(word_map.find(word)==word_map.end()){ if(used[pattern[pos]]){ //如果当前pattern已经使用 return false; } word_map[word]=pattern[pos]; used[pattern[pos]]=1; }else{ if(word_map[word]!=pattern[pos]){ //如果当前word已经建立了映射,无法与当前的pattern对应。 return false; } } word=""; pos++; }else{ word+=str[i]; } } if(pos!=pattern.length()){ return false; //有多余的pattern字符 } return true; } };


最新回复(0)