题目:Isomorphic Strings
给定两个字符串(长度相等),判断它们是否同构;同构:两个字符串的字母对应位置是否能够一一对应。
For example,
Given "egg"
, "add"
, return true.
Given "foo"
, "bar"
, return false.
Given "paper"
, "title"
, return true.
思路:
定义两个字符数组,分别一折两个字符串的字符为下标,另一个字符串的值为数组的值,遍历字符串,当有一个字符为下标的数组值已存在且与另一个字符串对应位置的值不相等,则表示它们不同构。
例如:
给定"foo"和"bar"两个字符串;
数组的值arr1[102] = b;arr1[111] = a;当遍历到第一个字符串的第二个o时,发现arr1[111] != r;所以它们不同构。
bool LeetCode::isIsomorphic(string s, string t){ vector<char>sAlph(128, 0);//s中的值为下标 vector<char>tAlph(128, 0);//t中的值为下标 for (size_t i = 0; i < s.size(); i++){ int k = s.at(i); if (!sAlph.at(k))sAlph.at(k) = t.at(i);//第一次遇到的字符,创建映射 else if (sAlph.at(k) != t.at(i))return false;//与已有的映射不同,则不同构 k = t.at(i); if (!tAlph.at(k))tAlph.at(k) = s.at(i);//以t为下标创建s字符的映射 else if (tAlph.at(k) != s.at(i))return false;//与已有的映射不同,则不同构 } return true; }
题目:Word Pattern
给定一个模式串,要求判断字符串str中的单词是否与该模式串同构;
注意:单词数不一定与模式串长度相同,且比较的是整个单词。
例如:
- pattern =
"abba"
, str ="dog cat cat dog"
should return true. - pattern =
"abba"
, str ="dog cat cat fish"
should return false. - pattern =
"aaaa"
, str ="dog cat cat dog"
should return false. - pattern =
"abba"
, str ="dog dog dog dog"
should return false.
思路:
使用map,像上面的一样需要两个map,key分别为模式串的字符和str的单词,值可以设为下标(第几个字符);
利用map[]操作当key不存在时,会自动创建该元素。
bool LeetCode::wordPattern(string pattern, string str){ map<char,int>pmap; map<string, int>smap; istringstream sin(str);//通过字符串流来分割单词 int i = 0; for (string word; sin >> word; i++){ if (i == pattern.size())return false;//如果str的单词数超过pattern的长度 if (pmap[pattern.at(i)] != smap[word])return false;//比较映射是否相等 pmap[pattern.at(i)] = smap[word] = i + 1;//当map中key不存在时,使用map[]会创建该元素,所以,在这里修改它 } return i == pattern.size(); }