带你读《图解算法小抄》十九、双指针(4)https://developer.aliyun.com/article/1348031?groupCode=tech_library
6.反转字符串中的元音字母
1)问题描述:
编写一个函数,以字符串作为输入,反转该字符串中的元音字母。
示例:
输入:"hello"
输出:"holle"
注意:
元音字母不包含字母"y"。
2)解题步骤:
- 设置两个指针,一个在开头,一个在末尾。开头的指针称为左指针,末尾的指针称为右指针。
- 遍历字符串,如果左指针指向的字符不是元音字母,左指针向右移动;如果右指针指向的字符不是元音字母,右指针向左移动。
- 当左右指针都指向元音字母时,交换两个指针指向的元素,然后左指针右移一位,右指针左移一位。
- 重复步骤 2 和 3,直到左指针大于或等于右指针,此时所有的元音字母已经反转,算法结束。
3)解题框架:
function reverseVowels(s) { let vowels = 'aeiouAEIOU'; let chars = Array.from(s); let left = 0, right = s.length - 1; while (left < right) { if (!vowels.includes(chars[left])) { left++; continue; } if (!vowels.includes(chars[right])) { right--; continue; } let temp = chars[left]; chars[left++] = chars[right]; chars[right--] = temp; } return chars.join(''); }
7.无重复字符的最长子串
1)问题描述:
给定一个字符串,找出不含有重复字符的最长子串的长度。
示例:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
2)解题步骤:
- 建立一个哈希表(JavaScript中可以使用一个对象),用来保存每个字符和它的索引。
- 设置两个指针,一个快指针用来遍历整个字符串,一个慢指针用来标记无重复字符子串的起始位置。
- 在遍历字符串的过程中,当遇到重复字符时,将慢指针移动到重复字符的下一个位置。注意,慢指针只能向前移动,不能后退。
- 每次移动快指针后,都计算一次最大的无重复字符子串的长度。
- 当快指针遍历完整个字符串后,返回最大的无重复字符子串的长度。
3)解题框架:
function lengthOfLongestSubstring(s) { let map = {}; let longest = 0; let start = 0; let i = 0; while (i < s.length) { let char = s[i]; if (map[char] !== undefined) { start = Math.max(start, map[char] + 1); } map[char] = i; longest = Math.max(longest, i - start + 1); i++; } return longest; }