题型一般都与统计字符出现次数有关系,常用哈希表存储每个元素出现的次数,然后加双指针遍历。
剑指offer II 14 字符串中的变位词
变位词指个单词的字母和出现次数相同,只是出现顺序不同。
step 1用数组模拟哈希表,数组下标0对应字母a,下标25对应字母z;
step 2 首先扫描字符串s1,对应哈希表值也++,然后扫描字符串s2,对应哈希表得值--;如果哈希表所有的值都为0,就是变位词。
step 3 判断长度为n的s2子串是不是s1的变位词,扫描字符串中的每一个字母,把该字母在哈希表中的位置减1,如果哈希表所有位置为0,则表示是变位词。
(先加加减减,再减减加加)
剑指offer II 不含重复字符的最长子字符串
解题思路:用一个哈希表key存放字符,值存放字符出现的次数,当value大于2时表示有重复字符出现。用一个双指针,当没有重复字符出现时,右边就++,当有重复字符出现左边就++。右边索引值-左边索引值的最大值即为问题的解。
step 1:定义一个长度为256的数组模拟哈希表,初始化longest,countDup;
step 2:在for循环不断往前走,当有重复字符出现,countDup++;
step 3:在下面while循环中,将重复字符跳过。
剑指offer II 18 有效的回文
回文:不管从前往后读,还是从后往前读得到的结果都是一样的。
思路:判断一串字符是不是回文用双指针,一个从左往右遍历,一个从右往左遍历,判断两个词是否相等,直到相遇。
step 1:定义i,j分别指向第一个字符和最后一个字符。
step 2:遍历,先判断是否为字符或数字,不是字符数字直接跳过,是的话比较是否相等。
cpp几个判断字符的内置函数:
记一笔 c++的几个内置函数:
islower(char c) 是否为小写字母
isupper(char c) 是否为大写字母
isdigit(char c) 是否为数字
isalpha(char c) 是否为字母
isalnum(char c) 是否为字母或者数字
toupper(char c) 字母小转大
tolower(char c) 字母大转小