Permutation in String
是否存在等价子串
my solution 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 class Solution {public : bool checkInclusion (string s1, string s2) { if (s2.size () < s1.size ()) return false ; map <char , int > mp; for (auto &v : s1) ++mp[v]; for (int i = 0 , b = 0 ; i < s2.size (); ++i) { if (!mp.count(s2[i])) { while (b < i && mp.count(s2[b]) != 0 ) ++mp[s2[b++]]; b = i + 1 ; } else if (--mp[s2[i]] < 0 ) { while (mp[s2[i]] < 0 ) ++mp[s2[b++]]; } if (i - b == s1.size () - 1 ) return true ; if (s2.size () - b < s1.size ()) return false ; } return false ; } };
用的是滑动窗口来做. 其中 map 存放元素. 不过可以不用高级数据结构. 因为小写英文字母总共也就 26 个, 其下标做索引. 还可以省去一个 int. 有一些优化的点, 可以通过最优算法来借鉴.
the best solution 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 class Solution {public : bool match (int map1[], int map2[]) { for (int i = 0 ; i < 26 ; i++) { if (map1[i] != map2[i]) return false ; } return true ; } bool checkInclusion (string str, string text ) { if (str.length() > text .length()) return false ; int *textMap = (int *)calloc (26 , sizeof (int )); int *strMap = (int *)calloc (26 , sizeof (int )); for (int i = 0 ; i < str.length(); i++) { textMap[text [i] - 'a' ]++; strMap[str[i] - 'a' ]++; } for (int i = 0 ; i < text .length() - str.length(); i++) { if (match(strMap, textMap)) return true ; textMap[text [i + str.length()] - 'a' ]++; textMap[text [i] - 'a' ]--; } return match(strMap, textMap); } };
一个关键的点是我不必一开始就将所有的 s2 获取. 这是我没想到的. (其实这也不难想到, 为什么呢 = =)
他也是滑动窗口. 这没有什么特别好说的. 这里顺便说一下 calloc. 这是一个附带初始化的 malloc.