开启我的LeetCode刷题日记:917. 仅仅反转字母

309 阅读2分钟

「这是我参与2022首次更文挑战的第25天,活动详情查看:2022首次更文挑战

编程世界总是离不了算法

最近在看框架源码时,会有很多算法的实现逻辑,有时候会感到吃力

于是决定蹭着假期,加强算法和数据结构相关的知识

那怎么提升呢?

其实我知道算法这东西没有捷径,多写多练才能提升,于是我开启我的LeetCode刷题之旅

第一阶段目标是:200道,每天12

为了不乱,本系列文章目录分为三部分:

  1. 今日题目:xxx
  2. 我的思路
  3. 代码实现

今天题目:1994. 好子集的数目

给你一个字符串 s ,根据下述规则反转字符串:

所有非英文字母保留在原有位置。 所有英文字母(小写或大写)位置反转。 返回反转后的 s 。

 

示例 1:

输入:s = "ab-cd" 输出:"dc-ba" 示例 2:

输入:s = "a-bC-dEf-ghIj" 输出:"j-Ih-gfE-dCba" 示例 3:

输入:s = "Test1ng-Leet=code-Q!" 输出:"Qedo1ct-eeLg=ntse-T!"

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/re… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

我的思路

在字符串左右两边分别设置指针,遍历字符串; 左指针从左侧遍历,直到碰到第一个单词字符; 右指针从右侧遍历,直到碰到第一个单词字符; 当左右指针停止时,交换指针指向的字符。 left 记录左指针遍历的字符; right 记录右指针遍历的字符;

处理边界 假设s中单词字符为偶数个,那么当 i 与 j 最后一次交换后,会出现以下几种情况 ij中间没有字符: ij指针向中间移动后,i > j; ij中间有非单词字符: 在下一次遍历左指针时,会遍历所有字符,直到 i == j; 假设s中单词字符为奇数个,则在下一次遍历,左指针会指向该字符,右指针也会指向该字符,i == j; 因此,当 i == j 时,我们需要将最后一个字符拼接上

代码实现

/**
 * @param {string} s
 * @return {string}
 */
var reverseOnlyLetters = function(s) {
    // 双指针
    let i = 0,j = s.length-1;
    let left ='', right = '';
    let wCharReg = /[a-zA-Z]/
    while(i < j) {
        while(i < j) {
            if(wCharReg.test(s[i])){
                break;
            } else {
                left += s[i++];
            }
        }
        while(i < j) {
            if(wCharReg.test(s[j])){
                break;
            } else {
                right = s[j--] + right;
            }
        }
        if(i < j) {
            left += s[j--];
            right = s[i++] + right;
        }
    }
    return left + (i == j ? s[i]:'') + right;
};


总结

实现方式其实有很多,这里仅供参考~

由于刚开始刷题,也不知道从哪里刷好,如果前辈们有好的建议,希望不吝赐教,感谢🌹