j

jaryue

V1

2023/05/24阅读:11主题:默认主题

leetcode 917. 仅仅反转字母

leetcode 917. 仅仅反转字母.


题目描述

  1. 仅仅反转字母

给你一个字符串 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!"

提示

1 <= s.length <= 100 s 仅由 ASCII 值在范围 [33, 122] 的字符组成 s 不含 '"' 或 '\'

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

解题思路

法1

双指针

  1. 申请两个指针分别指向字符串的尾节点与头节点

  2. 判断节点数据是否都是字母字符,如果是就交换,如果不是就将不是的向后移动,直到满足条件为止

  3. 当头节点指针>=尾节点指针结束循环

  4. 输出转换为字符串的结果

  • 时间复杂度(O(n))
  • 空间复杂度(O(n))

执行结果

法1

将字符串转换为字节数组,然后使用双指针i和j分别指向字符串的开头和末尾。

我们比较指针所指的字符,如果两个指针都指向英文字母,则交换它们的位置,并将指针向中间移动一步。

如果一个指针指向非英文字母,则将该指针向中间移动一步。重复这个过程直到i >= j。

最后,我们将字节数组转换回字符串并返回结果。

func reverseOnlyLetters(s string) string {
 letters := []byte(s)
 i, j := 0len(s)-1

 for i < j {
  if !isLetter(letters[i]) {
   i++
  } else if !isLetter(letters[j]) {
   j--
  } else {
   letters[i], letters[j] = letters[j], letters[i]
   i++
   j--
  }
 }

 return string(letters)
}

func isLetter(c byte) bool {
 return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')
}

执行结果: 通过 显示详情 查看示例代码 添加备注

执行用时: 0 ms , 在所有 Go 提交中击败了 100.00% 的用户 内存消耗: 1.8 MB , 在所有 Go 提交中击败了 88.00% 的用户 通过测试用例: 115 / 115 炫耀一下:



分类:

后端

标签:

后端

作者介绍

j
jaryue
V1