From 6aa4a624993072193292476e0e4e0b5fe4de86eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=94=90=E6=A0=91=E6=A3=AE?= <14021051@buaa.edu.cn> Date: Fri, 14 Sep 2018 20:37:37 +0800 Subject: [PATCH] Create 290. Word Pattern.md --- 290. Word Pattern.md | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 290. Word Pattern.md diff --git a/290. Word Pattern.md b/290. Word Pattern.md new file mode 100644 index 0000000..0db4c62 --- /dev/null +++ b/290. Word Pattern.md @@ -0,0 +1,34 @@ +# [290. Word Pattern](https://leetcode.com/problems/word-pattern/description/) +# 思路 +类似[205. Isomorphic Strings](https://leetcode.com/problems/isomorphic-strings/description/), 所以解题思路基本一样。 +将pattern和str中个每个元素都用一个数代替,这个数代表了该元素是第几个出现的(如 "abba" -> 1221, "dog cat cat dog" -> 1221), 则结果应该是一样的。 +为了记录是否出现过,pattern用一个长度为26的数组实现,str用map来实现,此外还用一个count计数。 +# C++ +``` +class Solution { +public: + bool wordPattern(string pattern, string str) { + mapmp; + vectorvc(26, 0); + string sub_str; + int count = 1, pos = 0, pre; // pos记录空格的下一个位置,pre为上一个空格位置的下一个位置 + for(int i = 0; i < pattern.size(); i++){ + if(pos >= str.size()) return false; // str中元素少于pattern中的元素 + pre = pos; + while(str[pos] != ' ' && pos < str.size()) pos++; // 此时pos为空格的位置或str结束位置 + // s.substr(pos1,n)返回字符串s从pos1开始n个字符组成的串 + sub_str = str.substr(pre, pos - pre); + pos++; // pos记录空格的下一个位置 + + // 以下代码基本同205题 + if(vc[pattern[i] - 'a'] != mp[sub_str]) return false; + if(vc[pattern[i] - 'a'] == 0){ + vc[pattern[i] - 'a'] = count; + mp[sub_str] = count++; + } + } + if(pos != str.size() + 1) return false; // str中元素多余pattern中的元素 + return true; + } +}; +```